1
2
/**
3
*
4
* 切勿调入Java继承的陷阱<br>
5
*
6
* CatfoOD
2011
-
8
-
2 上午09
:
53
:
27 yanming
-sohu@sohu
.com
/@qq
.com<br>
7
*
8
*/
9
public class TestExtends
{
10
11
public
static
void main
(String
[] args
) {
12
B b
= new B
();
13
/* 首先会打印"b: 0"然后才是"b: 3"*/
14
b
.rr
();
15
}
16
17
18
static class A
{
19
private
int a
=
1
;
20
21
A
() {
22
/* 在构造函数中调用的方法可能被重写 */
23
rr
();
24
}
25
26
/** 该方法未被调用 */
27
void rr
() {
28
System
.out
.println
(
"a: "
+ a
);
29
}
30
}
31
32
static class B extends A
{
33
private
int a
=
2
;
34
35
B
() {
36
a
=
3
;
37
}
38
/**
39
* 由于该方法重写了A的rr方法所以当B被创建时A的构造函数先被
40
* 调用
,但是此时B尚未初始但是B
.rr
()却被调用了
,于是在rr
()中
41
* 所有使用的属性都是默认值
(0或null
);同时A自己的属性也没有
42
* 被正确的初始化
.<br>
43
* 所以在父类的构造函数中调用的方法最好是private或final
(这
44
* 样就不能被子类重写
), 或者很明确的利用这种情况来构造程序
.
45
*/
46
void rr
() {
47
System
.out
.println
(
"b: "
+ a
);
48
}
49
}
50
}