第8章 多态 148

8.1 再论向上转型 148

8.1.1 忘记对象类型 149

8.2 转机 150

8.2.1 方法调用绑定 150
8.2.2 产生正确的行为 151
8.2.3 可扩展性 153
8.2.4 缺陷:“覆盖”私有方法 156
8.2.5 缺陷:域与静态方法 156

8.3 构造器和多态 157

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
多态:同一个对象(事物),在不同时刻体现出来的不同状态。
多态的前提:
A:要有继承关系。
B:要有方法重写。
C:要有父类引用指向子类对象。

多态的分类:
a:具体类多态
class Fu {}
class Zi extends Fu {}

Fu f = new Zi();
b:抽象类多态
abstract class Fu {}
class Zi extends Fu {}

Fu f = new Zi();
c:接口多态
interface Fu {}
class Zi implements Fu {}

Fu f = new Zi();

多态中的成员访问特点:
A:成员变量
编译看左边,运行看左边。
B:构造方法
创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。
C:成员方法
编译看左边,运行看右边。
由于成员方法存在方法重写,所以它运行看右边。
D:静态方法
编译看左边,运行看左边。
(静态和类相关,算不上重写,所以,访问还是左边的)
多态的好处:
A:提高了代码的维护性(继承保证(体现))
B:提高了代码的扩展性(由多态保证(体现))
多态的弊端:
不能使用子类的特有功能。

我就想使用子类的特有功能?行不行?
行。怎么用呢?
A:创建子类对象调用方法即可。(可以,但是很多时候不合理。而且,太占内存了)
B:把父类的引用强制转换为子类的引用。(向下转型)
对象间的转型问题:
向上转型:
Fu f = new Zi();
向下转型:
Zi z = (Zi)f; //要求该f必须是能够转换为Zi的。

多态:多种形态(同一函数,不同形态)
1、静态多态:程序在编译的时候就知道调用哪个方法
方法重载(Overrload)
2、动态多态:程序在运行时才确定调用哪个方法
方法重写(Override)
8.3.1 构造器的调用顺序 157
8.3.2 继承与清理 159
8.3.3 构造器内部的多态方法的行为 162
1
2
3
4
5
6
7
8
Student s = new Student();做了哪些事情?(理解)
- (1)把Student.class文件加载到内存
- (2)在栈内存为s开辟空间
- (3)在堆内存为学生对象申请空间
- (4)给学生的成员变量进行默认初始化。
- (5)给学生的成员变量进行显示初始化。
- (6)通过构造方法给成员变量进行初始化。
- (7)对象构造完毕,把地址赋值给s变量

8.4 协变返回类型 164

8.5 用继承进行设计 165

8.5.1 纯继承与扩展 166
8.5.2 向下转型与运行时类型识别 167

8.6 总结 168


书籍相关资源:

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