内部类
(实际中很少使用,只需了解)
什么是内部类:
在一个类中又写了另外一个类(类中类)。
什么时候使用内部类:
一个事物内部还有一个独立的事物,内部的事物脱离外部的事物无法独立使用。
内部类的分类(按位置划分):
- 成员内部类:写在类中方法外的类。
- 局部内部类:写在类中方法中的类。
成员内部类的使用:
- 1)创建外部类对象。例如:
Body b = new Body();
- )根据外部类对象创建内部类对象。例如:
Body.Heart h = b.new Heart();
也可以写在一起:
外部类名.内部类名 对象名 = new 外部类型().new 内部类型();
成员内部类的好处:
可以直接使用外部类的成员,包括私有成员。
成员内部类编译后的结果:
外部类名$内部类名.class.
在内部类的方法中,调用外部类的成员变量:
外部类名.this.成员变量
局部内部类的作用:
在定义好类后,立马创建对象,并使用。
- 创建好的对象跟着类后面写,也在方法里
局内内部类的好处:
可以直接使用外部类的成员,包括私有成员。
局部内部类编译后的特点:
外部类名 $ 数字 内部类名.class
- 数字的意思是,该方法中,该类的编号。
- 一个方法可能有几个内部类。
匿名内部类(重点)
概述:
没有名字的内部类。
- 它的本质是一个 带具体实现的 父类或者父接口的 匿名的 子类对象。
前提:
匿名内部类必须继承一个父类或者实现一个父接口。
格式:
new 父类名或者接口名(){
// 方法重写
@Override
public void method() {
// 执行语句
}
};
- 大括号后记得加 ;
- 此父类不能用final修饰。
保存对象:
- 接口 变量名 = new 接口();
- 父类 变量名 = new 父类();
- 多态
若只是调用方法,则可以不创建保存对象:
new 父类名或者接口名(){
// 方法重写
@Override
public void method() {
// 执行语句
}
}.方法名();
本质:
- 定义一个没有名字的内部类。
- 没有名字的类 实现接口/继承父类。
- 创建这个没有名字的类的对象。
优点:
简化接口的使用,一步到位。
缺点:
只能使用一次。(可以创建对象保存)
使用场景:
作为参数传递。
注意事项:
匿名内部类也能定义成员变量。
引用类型用法总结
class作为成员变量
概述:
自定义类型也是类型,和int double是一样的。
格式:
数据类型 变量名;
注意事项:
- 类名作为参数,要传入这个类的对象。
- 类名作为成员变量,需要这个类的对象。
- 类名作为返回值需要返回这个类的对象。
interface作为参数和返回值
注意事项:
- 接口作为参数,传入实现类对象。
- 接口作为返回值。需要返回接口的实现类对象。
匿名对象
概述:
没有名字的对象。
创建格式:
new 类名()
有名对象和匿名对象的对比:
- 代码长短问题
- 有名对象代码长。
- 匿名对象代码短。
- 调用问题
- 有名对象通过名称可以多次调用。
- 匿名对象没有名字只能调用一次。
好处:
代码少一点。
使用场景:
- 调用一次方法的时候。
- 作为参数传递。
- 作为方法的返回值。
对象数组
回顾引用数据三种类型:
- 数组
- 类
- 接口
数组格式:
数据类型【】 数组名 = new 数据类型【长度】;
- 数组用来存储多个数据的。数组中可以存储基本数据类型,也可以存储对象。
- 存进对象数组的,就是对象的地址。
可变参数
概述:
- JDK1.5的新特性。
- 参数个数可以是任意个(0到n个)。
本质:
数组
格式:
数据类型...变量名 【实质上是数组,所以也能说是数组名】
- 注意,是三个 .
注意事项:
方法中最多只能有一个可变参数且必须出现在参数列表的最后面。