第10章 内部类 190

需要细看,后期需要时不时的回看

10.1 创建内部类 190

10.2 链接到外部类 191

10.3 使用.this与.new 193

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
(1)把类定义在另一个类的内部,该类就被称为内部类。隐含着一个指向外部类的对象引用
举例:把类B定义在类A中,类B就被称为内部类。
(2)内部类的访问规则
A:可以直接访问外部类的成员,包括私有
B:外部类要想访问内部类成员,必须创建对象
(3)内部类的分类
A:成员内部类
B:局部内部类
成员位置:在成员位置定义的类,被称为成员内部类。
局部位置:在局部位置定义的类,被称为局部内部类。
(4)成员内部类
A:private 为了数据的安全性
B:static 为了访问的方便性
如何直接访问内部类的成员:
外部类名.内部类名 对象名 = 外部类对象.内部类对象;
成员内部类不是静态的:
外部类名.内部类名 对象名 = new 外部类名.new 内部类名();
成员内部类是静态的:
外部类名.内部类名 对象名 = new 外部类名.内部类名();

注意:静态内部类访问的外部类数据必须用静态修饰。
(5)局部内部类
局部内部类访问局部变量的注意事项?
A:局部内部类访问局部变量必须加final修饰。
B:为什么呢?
因为局部变量使用完毕就消失,而堆内存的数据并不会立即消失。
所以,堆内存还是用该变量,而改变量已经没有了。
为了让该值还存在,就加final修饰。
通过反编译工具我们看到了,加入final后,堆内存直接存储的是值,而不是变量名。

10.4 内部类与向上转型 194

10.5 在方法和作用域内的内部类 195

10.6 匿名内部类 196

1
2
3
4
5
6
7
8
9
10
11
12
13
14
	A:是局部内部类的简化形式
B:前提
存在一个类或者接口
C:格式:
new 类名或者接口名() {
重写方法;
}
D:本质:
其实是继承该类或者实现接口的子类匿名对象
E:匿名内部类中用到外部参数时,外部参数必须是final修饰
匿名内部类在开发中的使用
我们在开发的时候,会看到抽象类,或者接口作为参数。
而这个时候,我们知道实际需要的是一个子类对象。
如果该方法仅仅调用一次,我们就可以使用匿名内部类的格式简化。
10.6.1 再访工厂方法 199

10.7 嵌套类 201

内部类声明static,即为嵌套类,这时,就不包含外围对象的引用了,也只能访问外部的static成员

10.7.1 接口内部的类 202

接口可以有内部类

10.7.2 从多层嵌套类中访问外部类的成员 203

10.8 为什么需要内部类 204

10.8.1 闭包与回调 205
10.8.2 内部类与控制框架 207

10.9 内部类的继承 212

10.10 内部类可以被覆盖吗 212

10.11 局部内部类 214

10.12 内部类标识符 215

10.13 总结 215


书籍相关资源:

pdf文档链接:https://pan.baidu.com/s/1yuWb_kI0sB3yHLBndPcyEg 提取码:scvw
书中demo: https://github.com/BruceEckel/TIJ4-code
Thinking in Java 4th英文版的课后习题答案: http://greggordon.org/java/tij4/solutions.htm