当前位置: 首页 > 编程日记 > 正文

《Java从入门到精通》第九章学习笔记

第9章 类的高级特性

一、抽象类

抽象类只声明方法的存在,不能被实例化,就是说抽象类不能创建其对象,在定义抽象类时要在class前面加上abstract关键字。

 1 /*定义一个抽象类Fruit,并定义其抽象方法
 2  *在其子类中实现该抽象方法
 3  */
 4 abstract class Fruit {
 5     public String color;
 6     public Fruit(){
 7         color="green";
 8     }
 9     //定义一个抽象方法
10     public abstract void harvest();
11 }
12 
13 public class Farm {
14     public static class Apple extends Fruit{
15         @Override
16         public void harvest(){
17             System.out.println("收获苹果!");
18         }
19     }
20 
21     public static void main(String[] args){
22         Apple apple=new Apple();
23         System.out.println(apple.color);
24         apple.harvest();
25     }
26 }


二、内部类

在一个类中再定义一个类,即内部的成为内部类。内部类可以直接存取外部类的私有成员变量。

1、成员内部类:

 1 public class OuterClass {
 2     innerClass in=new innerClass();//外部类中实例化内部类
 3     public void ouf(){      //外部类方法中通过内部类实例对象调用内部类方法
 4         in.inf();
 5     }
 6     class innerClass{     //定义内部类
 7         innerClass(){     //内部类构造方法
 8         }
 9         public void inf(){  //内部类成员方法
10         }
11         int y=20;        //定义内部类成员变量
12     }
13     public innerClass doit(){   //定义外部类方法,返回类型为内部类引用类型
14         //y=4;            //外部类方法中不能直接访问内部类成员变量
15         System.out.println("mark0:doit方法中的输出"+in.y);
16         in.y=4;            //必须通过内部类实例对象访问
17         return new innerClass();
18     }
19     public static void main(String[] args){
20         OuterClass out=new OuterClass();
21         OuterClass out1=new OuterClass();
22         OuterClass.innerClass in=out.doit();
23         //通过doit方法实例化内部类对象in
24         //内部类的对象实例化操作必须在外部类或外部类的非静态方法中实现
25         System.out.println("mark1:out.in方法中的输出"+out.in.y);
26         System.out.println("mark2:直接in的输出--??这里输出为什么是20??"+in.y);//这里输出为什么是20??
27 
28         OuterClass.innerClass ina=out1.new innerClass();
29         //或者通过外部类的实例对象调用内部类的构造方法
30         System.out.println("mark3:out1.in方法中的输出"+out1.in.y);
31         System.out.println("mark4:直接ina的输出"+ina.y);
32     }
33 }

*如果外部类中和内部类中定义了同名称的成员变量,可以通过this关键字指定。

 1 public class TheSameName {
 2     private int x;
 3     private class Inner{
 4         private int x=9;
 5         public void doit(int x){
 6             x++;        //调用方法的形参x
 7             this.x++;   //调用内部类的变量x
 8             TheSameName.this.x++;   //调用外部类的变量x
 9         }
10     }
11 }

2、局部内部类
局部内部类即是在类的方法中定义的内部类。相应地,局部内部类的作用范围也是在这个方法体内。

 1 public class SellOutClass {
 2     private String name;     //定义成员变量
 3     public SellOutClass(){   //定义构造函数
 4         name="苹果";
 5     }
 6     public void sell(int price){   //定义成员方法
 7         class Apple{               //定义局部内部类
 8             int innerPrice=0;       //局部内部类的成员变量
 9             public Apple(int price){ //局部内部类的构造方法
10                 innerPrice=price;
11             }
12             public void price(){     //局部内部类的成员方法
13                 System.out.println("现在开始销售"+name);
14                 System.out.println("单价为:"+innerPrice+"元");
15             }
16         }
17         Apple apple=new Apple(price);//实例化局部内部类
18         apple.price();                 //调用局部内部类的方法
19     }
20     public static void main(String[] args){
21         SellOutClass sample=new SellOutClass();//创建实例化对象
22         sample.sell(100);  //通过该对象调用SellOutClass的方法
23     }
24 
25 }

3、匿名内部类

有时候内部类根据情况可以不取名,而直接通过创建的类的实例对象去实现,即在实例对象的体内编写代码。

因为匿名内部类没有名称,所以其使用默认的构造方法来生成内部类的对象。并且在匿名内部类定义结束后需要加分号。

 1 public class OutString {
 2 
 3     public static void main(String[] args) {
 4         final String sourceStr="Ji Lin  Province !";
 5         IStringDeal s=new IStringDeal(){   //编写匿名内部类
 6             @Override                //重写接口的方法  
 7             public String filterBlankChar(){
 8                 String convertStr=sourceStr;
 9                 convertStr=convertStr.replaceAll(" ","");
10                 return convertStr;
11             }
12         };                    //注意这里要加分号
13         System.out.println("源字符串:"+sourceStr);
14         System.out.println("转换后的字符串:"+s.filterBlankChar());
15     }
16 }
1 //定义接口
2 public interface IStringDeal {
3     public String filterBlankChar();
4 }

4、静态内部类

静态内部类中可以定义静态成员(非静态内部类则不可以);同时静态内部类不可以使用外部类的非静态成员。

5、内部类的继承

与普通类一样,内部类也可以被继承。在某个类继承内部类时,必须强制给这个类一个带参构造方法,并且该构造方法的参数

必须是内部类的外部类的引用。

class A{class B{}
}//创建A的内部类Bpublic class OutputInnerClass extends A.B{public OutputInnerClass(A a){a.super();}
}

 三、class类与Java反射

通过Java反射机制可以在程序中访问已经装载到JVM中的对象的描述,实现访问、检测和修改描述Java对象本身信息的功能。在java.lang.reflect包中提供了对该功能的支持。

所有Java类都继承了Object类,在Object类中定义了一个getClass()方法,该方法返回一个类型为Class的对象。代码如下:

Class textFieldC=JTextField.getClass();       //textField为JTextField类的对象

通过这个对象textFieldC,可以访问用来返回该对象的textField对象的描述信息,主要包括以下内容:

*包路径:getPackage();

*类名称:getName();

*继承类:getSuperclass();    //获得该类继承的类

*实现接口:getInterfaces();  //获得该类实现的所有接口

*构造方法:getConstructors();//获得所有权限为public的构造方法

*方法:getMethods();      //获得所有权限为public的方法

*成员变量:getFields()    //获得所有权限为public的成员变量

*内部类:getClasses()

四、实战练习

 1 /*编写Java程序,创建一个类,并在其中创建成员内部类,通过该内部类计算 
 2  *从1到任意数的和的操作
 3  *在外部类中进行测试
 4  */
 5 import java.util.Scanner;
 6 public class Sum {
 7     InnerSum inner=new InnerSum();
 8     public class InnerSum{
 9         public int getSum(int n){
10             if(n==1){
11                 return 1;
12             }else {
13                 return getSum(n-1)+n;
14             }
15         }
16     }
17     public static void main(String[] args){
18         Scanner scan=new Scanner(System.in);
19         System.out.println("请输入一个正整数:");
20         int x=scan.nextInt();
21         Sum sum=new Sum();
22         int xSum=sum.inner.getSum(x);
23         System.out.println("从1到"+x+"之和为"+xSum);
24     }
25 }

//定义接口
public interface MyString {String makeString();
}
import java.util.Scanner;
public class Demo {//创建一个接口作为参数的成员方法public void showMyString(MyString a){String x=a.makeString();System.out.println("my string is:"+x);}public static void main(String[] args) {// TODO Auto-generated method stubDemo myDemo=new Demo();//实例化对象//调用成员方法//方法一:实参通过匿名内部类的方法创建myDemo.showMyString(new MyString(){    public String makeString(){System.out.println("plz input your string:");Scanner scan=new Scanner(System.in);return scan.nextLine();}});//方法二:先通过匿名内部类创建接口的实例MyString myStr1=new MyString(){public String makeString(){System.out.println("plz input your string:");Scanner scan=new Scanner(System.in);return scan.nextLine();}};//再把上述创建的接口实例作为参数传递
        myDemo.showMyString(myStr1);}
}

转载于:https://www.cnblogs.com/tsembrace/p/4575285.html

相关文章:

Python中的super()函数

多路继承的问题 描述: 解决这样的问题Python中可以使用super() super()函数有点: (1)在父类中可以直接的调用未绑定的方法 (2)在确保所有的父类的构造方…

【UE5教程】影棚拍摄于虚拟场景合成制作流程学习

用虚幻引擎预算虚拟生产5 你会学到什么 使用虚幻引擎5进行虚拟生产 使用虚幻引擎5的独立虚拟制作 用虚幻引擎预算虚拟生产5 用虚幻引擎5进行穷人虚拟生产 用虚幻引擎5进行自制虚拟制作 虚幻引擎5独立虚拟制作 带虚幻引擎5的复合绿屏 虚拟生产导论 面向初学者的虚拟生产 MP4 |视…

java面试题:分布式和微服务的区别

分布式架构解决的是如何将一个大的系统划分为多个业务模块这些业务模块会分别部署到不同的机器上,通过接口进行数据交互的问题。微服务是指很小的服务,可以小到只完成一个功能,这个服务可以单独部署运行,不同服务之间通过rpc调用。分布式架构是将一个大的系统划分为多个业务模块,这些业务模块会分别部署到不同的机器上,通过接口进行数据交互。微服务架构是架构设计方式,是设计层面的东西,一般考虑如何将系统从逻辑上进行拆分,也就是垂直拆分。分布式系统是部署层面的东西,即强调物理层面的组成,即系统的各子系统部署在不同计算机上。

python安装成功的图标_ubuntu下:安装anaconda、环境配置、软件图标的创建、成功启动anaconda图形界面...

Ubuntu安装anaconda常见的四大问题:目录1、介绍2、安装anaconda3、环境配置4、软件图标的创建5、成功启动anaconda图形界面1、介绍先介绍一下anaconda和python的关系:初学者所安装的python2/3只是python的环境,没有python的工具包&a…

jQuery和dom的相互转换

1.将DOM对象转换成jQuery对象 $div $(objDom); 2.将jQuery对象转换成DOM对象 objDom $(objJqeury).get(0); 3.判断一个元素是否存在于页面 jQuery方法: $("#id").length >0:代表存在于页面 0:不存在页面 4.取另一个页面中存在的元素 …

VScode的撤销操作的快捷键

撤销刚才的操作:CtrlZ 恢复刚才的操作:CtrlShiftZ

IOS初级:UIAlertController

- (IBAction)signOutAction:(id)sender {//初始化,StyleActionSheet是对话框的样式UIAlertController *alert [UIAlertController alertControllerWithTitle:"是否注销?" message:"真的要注销吗" preferredStyle:UIAlertControllerStyleActionSheet];//添…

1976年图灵奖

获奖原因: 在1959年发表的论文“有限自动机及其判定问题”中提出了非确定性有限状态自动机这一概念。 图灵奖引用: 授 予 MichaelO. Rabin与DanaSteward Scott图灵奖以表彰合作撰写的研究论文“有限自动机与其判定性问题”。在该研究论文中,…

UE4蓝图无代码编程游戏开发技能学习教程

在虚幻引擎4中创建、设计和开发自己的游戏,无需编码 你会学到什么 虚幻引擎4中使用蓝图的游戏开发(无代码编程) 使用行业标准方法的游戏设计 使用Maya进行三维设计 在本课程中创建您的第一个游戏 Game Development Essentials with Unreal Engine 4 Blueprints M…

“睡眠猴子”团队项目及成员介绍

“睡眠猴子”团队项目及成员介绍 咳咳……软件工程这门课最终还是来到了团队开发的部分,我们宿舍三只经过一下午的讨论和需求分析决定做一款名叫“睡眠猴子”的安卓版手机软件,具体的项目功能和团队介绍如下: 一、“睡眠猴子”开发团队介绍&a…

python代码编写规范_python初学者-代码规范

一、编程规范 1.缩进(代码块) 类定义、函数定义、选择结构、循环结构、with块、行尾的冒号表示缩进的开始。 python程序是依靠代码块的缩进来体现代码之间的逻辑关系,缩进结束就表示一个代码块结束。 同一个级别的代码块的缩进量必须相同。 一…

程序出现 ld returned 1 exit status的解决办法之一

把正在运行的窗口关闭

基于自然的灵感算法--元启发式

问题一:自然赋予的元启发式优化算法的分类 自然赋予的元启发式算法(模拟生物或者物理的现象去解决问题)有三大类也就是:基于进化,基于物理的,基于群体的 基于进化的主要是受达尔文的物种进化理论的启发&a…

三维地形制作软件 World Machine 基础入门学习教程

《World Machine课程》涵盖了你需要的一切,让你有一个坚实的基础来构建自己的高质量的电影或视频游戏地形。 你会学到什么 为渲染或游戏开发创建高分辨率、高细节的地形。 基于World Machine蒙版和着色设备的纹理地形。 获得哪个节点达到预期结果的信心。 组装宏以…

python编写脚本方法_【Python】教你一步步编写banner获取脚本

Hello 各位小伙伴们大家好,周末过的愉快吗? 刚好最近学习了使用python编写banner获取脚本,今天就跟大家一起一步一步再学习一遍吧。 Part.1 说明篇 什么是banner? banner可以理解为我们连上服务器后,服务器响应的第一条…

Linux内核分析——可执行程序的装载

链接的过程 首先运行C预处理器cpp,将C的源程序(a.c)翻译成ASCII码的中间文件(a.i)接着C编译器ccl,将a.i翻译成ASCII汇编语言文件a.s接着运行汇编器as,将a.s翻译成可重定位的目标文件a.o最终完全链接成可执行文件a.out目标文件 目标文件有三种…

c语言中external,static关键字用法

static用法: 在C中,static主要定义全局静态变量、定义局部静态变量、定义静态函数。 1、定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量。全局静态变量有以下特点。 a.在全局区分配内存。 b.如…

男神女神配——alpha阶段总结

一、需求分析 虽然公共社交网络系统能够满足大多数高校校园用户在校园网络社交的需求,但是针对校园学习、工作和文化生活等方面的支持以及学校个性化需求方面却存在不足。利用电子校务平台的数据,设计了与真实校园环境和活动紧密结合,包含具有…

正向代理和反向代理??

(5 条消息)正向代理 反向代理 本质区别? - 知乎 https://www.zhihu.com/question/36412304/answer/76804314 正向代理,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代…

虚幻引擎5(UE5)实时VFX游戏特效制作入门到精通

UE5 Niagara学习教程 课程获取:虚幻引擎5(UE5)实时VFX游戏特效制作入门到精通-云桥网 你会学到什么 我将通过创建各种各样的实时效果来教你虚幻引擎中强大的粒子系统。 我们将从简单的基础知识开始,然后逐渐地,我们将…

share extension 不显示_你所不知道的网红小酒馆Helens

当夜幕降临后,Helens小酒馆显示出她真正的魅力约上你的好友,来Helens体验一次穿越异国的饮酒之旅吧由美、中、泰设计师倾力打造,有着浓郁的东南亚异域style。木质的桌椅、精美的木雕装饰,每个细节都可以感受到不同文化的碰撞。别样…

怎么将jenkins打包后的war自动部署到jetty上?

1,使用maven的cargo插件,实现远程部署 (官网描述地址:https://codehaus-cargo.github.io/cargo/JettyRemoteDeployer.html) Maven中添加配置文件: Type: 可选参数有remote(远程部署的模式&#…

自制青蛙跳台阶小游戏~

青蛙跳台阶小游戏 1、概念(concept)文档 楔子(Setting):千百年来,人们在贬低别人时,常用井底之蛙来描述那个人,但这却让青蛙不开心了,于是青蛙决定跳出井底,为自己讨一个公道。 玩法…

提高性能的Varnish缓存方案

转载http://www.s135.com/post/313/arnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸 Verdens Gang (http://www.vg.no) 使用3台Varnish代替了原来的12台squid,性能居然比以前更好。Varnish 的作者Poul-Henning Kamp是FreeBSD的内核开发者之一&am…

Python学习小甲鱼视频003

变量 变量名就类似于我们现实社会的名字,发一个值赋值给一个名字的时候,它会存储在内存中,称之为变量(Variable) 但是Python并没有将值存储在变量中,而更像是把名字贴在值上。或者说Python只有名字而没有…

虚幻引擎的数学知识学习教程 Math for Unreal Engine (Early Preview)

通过做真实世界的 Unreal Engine项目来学习数学 你会学到什么 理解游戏开发对数学的基本需求 将数学直接应用到用例中,而不是钻研理论(用我们的示例项目进行实践) 正确编辑短视频,节省您的时间 本课程涵盖向量数学、基础三角、叉/点积和四元数旋转 要求…

2016.4.2 动态规划练习--讲课整理

1.codevs1742 爬楼梯 时间限制: 1 s空间限制: 128000 KB题目等级 : 黄金 Gold题目描述 Description小明家外面有一个长长的楼梯,共N阶。小明的腿很长,一次能跨过一或两阶。有一天,他突发奇想,想求出从最低阶到最高阶共有几种爬楼梯…

matlab 通过矩阵变换使图像旋转平移_图像的几何变换

学习图像中的仿射变换(affine transform), 这是一种线性变换(涵盖旋转,平移,错切(shear), 缩放等线性变换),既然是线性变换则可以通过线性变换(矩阵)来获得。仿射变换矩阵M为2*3的矩阵。仿射变换…

用伪代码模拟洗衣机的运转流程

今天的软导课又学到了不少“骚操作”,其中就包括Pseudocode和Top-down design。 不如现在就借着介绍洗衣机的运转流程向大家介绍一下这两个简单的东西。 题目如下 仔细观察您洗衣机的运作过程,运用Top-down设计方法和Pseudocode 描述洗衣机控制程序。 假…

使用 PHP 在站点上构建类似 Twitter 的系统

2019独角兽企业重金招聘Python工程师标准>>> 如果您曾经留意过,就会知道 Twitter 是 Web 2.0 世界最大的轰动事件之一。简单来说,Twitter(Twitter.com 上提供的一个服务)是一个简单的微博客服务,用户可以发…