第7章 复用类 125

7.1 组合语法 125

7.2 继承语法 127

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
(1)把多个类中相同的成员给提取出来定义到一个独立的类中。然后让这多个类和该独立的类产生一个关系,
这多个类就具备了这些内容。这个关系叫继承。
单独的这个类称为父类,基类或者超类;这多个类可以称为子类或者派生类。
(2)Java中如何表示继承呢?格式是什么呢?
A:用关键字extends表示
B:格式:
class 子类名 extends 父类名 {}
(3)继承的好处:
A.提高了代码的复用性
多个类相同的成员可以放到同一个类中
B.提高了代码的维护性
如果功能的代码需要修改,修改一处即可
C.让类与类之间产生了关系,是多态的前提
其实这也是继承的一个弊端:类的耦合性很强

(4)继承的弊端:
A:让类的耦合性增强。这样某个类的改变,就会影响其他和该类相关的类。
原则:低耦合,高内聚。
耦合:类与类的关系
内聚:自己完成某件事情的能力
B:打破了封装性
(5)Java中继承的特点
A:Java中类只支持单继承
一个类只能有一个父类,不可以有多个父类。
B:Java中可以多层(重)继承(继承体系)
class A{}
class B extends A{}
class C extends B{}
(6)继承的注意事项:
A:子类不能继承父类的私有成员
B:子类不能继承父类的构造方法,但是可以通过super去访问
C:不要为了部分功能而去继承
(7)什么时候使用继承呢?
A:继承体现的是:is a的关系。
B:采用假设法
(8)Java继承中的成员关系
A:成员变量
a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单
b:子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢?
子类的方法访问变量的查找顺序:
在子类方法的局部范围找,有就使用。
在子类的成员范围找,有就使用。
在父类的成员范围找,有就使用。
找不到,就报错。
B:构造方法
a:子类的构造方法默认会去访问父类的无参构造方法
是为了子类访问父类数据的初始化
注意:子类每一个构造方法的第一条语句默认都是:super();
b:父类中如果没有无参构造方法,怎么办?
子类通过super去明确调用带参构造
子类通过this调用本身的其他构造,但是一定会有一个去访问了父类的构造
让父类提供无参构造
C:成员方法
a:子类的成员方法和父类中的成员方法名称不一样,这个太简单
b:子类的成员方法和父类中的成员方法名称一样,这个怎么访问呢?
通过子类对象访问一个方法的查找顺序:
在子类中找,有就使用
在父类中找,有就使用
找不到,就报错
(9)两个面试题:
A:Override和Overload的区别?Overload是否可以改变返回值类型?
方法重写:
在子类中,出现和父类中一模一样的方法声明的现象。
方法重载:
同一个类中,出现的方法名相同,参数列表不同的现象。(同类同名不同参)
方法重载能改变返回值类型,因为它和返回值类型无关。

方法重载:同名同类不同参
同名:方法名相同
同类:同一作用域
不同参(参数列表):个数、类型、顺序
构造方法的重载
方法重写(覆盖):
前提条件:必须有继承
必要条件:子类方法和父类中的方法同原型(方法名、
返回值类型、形参列表完全相同)
注意:1、子类方法的访问权限不得低于父类方法的访问权限
2、子类中抛出的异常不得多于父类方法抛出的异常

返回值类型 方法名 形参列表
方法重写:必须相同 相同 相同
方法重载:无关 相同 必须不同

B:this关键字和super关键字分别代表什么?以及他们各自的使用场景和作用。
this:代表当前类的对象引用
super:代表父类存储空间的标识。(可以理解为父类的引用,通过这个东西可以访问父类的成员)
场景和作用:
A:调用成员变量
this.成员变量 调用本类的成员变量
super.成员变量 调用父类的成员变量
B:调用构造方法
this(...) 调用本类的构造方法
super(...) 调用父类的构造方法
注意事项:
this(...)或者super(...)必须出现在第一条语句上。
如果不是放在第一条语句上,就可能对父类的数据进行了多次初始化,
所以必须放在第一条语句上。
C:调用成员方法
this.成员方法 调用本类的成员方法
super.成员方法 调用父类的成员方法
(10)数据初始化的面试题
A:一个类的初始化过程
成员变量进行初始化
默认初始化
显示初始化
构造方法初始化
B:子父类的构造执行过程
先进行父类初始化,然后进行子类初始化。
C:分层初始化
(11)方法重写:子类中出现了和父类中方法声明一模一样的方法。
方法重写的注意事项:
A:父类中私有方法不能被重写
因为父类私有方法子类根本就无法继承
B:子类重写父类方法时,访问权限不能更低
最好就一致
C:父类静态方法,子类也必须通过静态方法进行重写
其实这个算不上方法重写,但是现象确实如此,至于为什么算不上方法重写,多态中我会讲解
D:子类重写父类方法的时候,最好声明一模一样
方法重写的应用:当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法。
这样,即沿袭了父类的功能,又定义了子类特有的内容。

方法重载:本类中出现的方法名一样,参数列表不同的方法。与返回值无关。
7.2.1 初始化基类 129

7.3 代理 130

7.4 结合使用组合和继承 132

7.4.1 确保正确清理 133
7.4.2 名称屏蔽 135

7.5 在组合与继承之间选择 137

7.6 protected关键字 138

7.7 向上转型 139

7.7.1 为什么称为向上转型 139
7.7.2 再论组合与继承 140

7.8 final关键字 140

7.8.1 final 数据 140
7.8.2 final 方法 143
7.8.3 final 类 144
7.8.4 有关final的忠告 145
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
final是最终的意思,可以修饰类,方法,变量
面试题:特点:
final可以修饰类,该类不能被继承。
final可以修饰方法,该方法不能被重写。(覆盖,复写)
final可以修饰变量,该变量不能被重新赋值。因为final修饰的变量是常量。

final修饰变量的初始化时机
A:被final修饰的变量只能赋值一次。
B:在构造方法完毕前。(非静态的常量)

final:最终的(finally,finalize)
1final修饰变量:常量,只能访问,不能改变值
定义常量时必须初始化(常量名全大写)
public static final int NUMBER = 20;
2、修饰方法:该方法不能被重写
3、修饰类:不允许有子类

面试题:final修饰局部变量的问题
基本类型:基本类型的值不能发生改变。
引用类型:引用类型的地址值不能发生改变,但是,该对象的堆内存的值是可以改变的。

7.9 初始化及类的加载 145

7.9.1 继承与初始化 146

7.10 总结 147


书籍相关资源:

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