内部类
1. 什么是内部类?
写在一个类里面的类就叫做内部类
2. 什么时候用到内部类?
一个类表示的事物是另一个类的一部分,且单独存在没有意义
比如:汽车的发动机,人的心脏等等
3. 成员内部类
- 写在成员位置的,属于外部类的成员
- 成员内部类可以被一些修饰符所修饰
- JDK16之前不能在内部类中定义静态变量,JDK16开始才可以定义静态变量
- 获取成员内部类对象的两种方式:
方式一:在外部类编写方法,对外提供内部类对象(通常是内部类被修饰为private时才用)
如:
private class Inner(){}
public Inner getInner(){
return new Inner();
}
方式二:直接创建
格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象
范例:Outer.Inner oi = new Outer().new Inner()
外部类成员变量和内部类成员变量重名时,在内部类如何访问?
System.out.println(Outer.this.变量名)
4. 静态内部类
什么是静态内部类?
静态内部类是一种特殊的成员内部类
直接创建静态内部类对象的方式?
Outer.Inner oi = new Outer.Inner();
如何调用静态内部类中的方法?
- 非静态方法:先创建对象,用对象调用
- 静态方法:外部类名.内部类名.方法名();
5. 局部内部类
- 将内部类定义在方法里面就叫做局部内部类,类似于方法里的局部变量
- 外界是无法直接使用,需要在方法内部创建对象并使用
- 该类可以直接访问外部类的成员,也可以访问方法内的局部变量
6. 匿名内部类
什么是匿名内部类?
隐藏了名字的内部类,可以写在成员位置,也可以写在局部位置
匿名内部类的格式?
new 类名或接口名(){
重写方法;
};
匿名内部类等价于
没有名字的Java类 + 实现接口/继承 + 重写方法 + 创建对象
使用场景?
- 如果实现类(实现了接口的类)只要使用一次,就可以用匿名内部类简化代码,不用单独创建一个实现类的文件
- Lambda表达式的前置知识点
7. 接口和匿名内部类的区别
接口:是规则 / 标准,只定义「要干什么」,不实现。
匿名内部类:是临时创建的一个类 + 当场实现接口,用完就扔,没有名字。
1. 接口 interface
- 是一种抽象规范
- 里面只有抽象方法(默认 public abstract)
- 不能 new 实例,只能被类实现
- 作用:定规矩,规定必须有哪些方法
匿名内部类
- 没有类名,当场 new、当场写实现
- 临时实现一个接口 / 继承一个父类
- 只用一次,写完就用完,不重复使用
- 本质:一个没有名字的子类
| 维度 | 接口 interface | 匿名内部类 |
|---|---|---|
| 有没有名字 | 有 | 没有类名 |
| 作用 | 定义规范、抽象方法 | 临时实现接口 / 父类 |
| 能不能实例化 | 不能直接 new | 可以直接 new 接口() |
| 是否写方法体 | 只能声明,不能写实现 | 必须重写所有抽象方法,写方法体 |
| 复用性 | 可以被很多类实现,可复用 | 只能当场用一次,不能复用 |
| 位置 | 单独写一个接口 | 写在方法内部、参数里 |
| 关系 | 是父级规范 | 是接口的临时实现类 |
浙公网安备 33010602011771号