package 测试;
class A{
int a =2;
public void doSomething(){
System.out.println(a);
}
public A(){
doSomething();
}
}
class B extends A{
int a =1;
public B(){ }
public void doSomething(){
System.out.println(a);
}
}
public class Test {
public static void main(String[] args) {
new B();
}
}
结果
0
由于动态绑定的方法调用会向外深入到继承层次结构内部,它可以调用导出类里的方法。(Think in java ;page163)
所以A构造函数中的doSomething调用的是导出类(子类)B中的doSomething方法。
初始化过程:
1)在任何事物发生之前,将分配给对线的存储空间初始化成二进制的零。 比如 int a =1 ; 在最开始被初始化为了int a = 0;
2)调用基类(父类)构造器,此时调用被覆盖后的doSomething()方法。由于步骤1的缘故,此时a = 0;
在此另外说一句:
应当用尽可能简单的方法使对象进入正常状态,可以的话避免调用其他方法。在构造器内唯一能够安全调用的是那些基类中的final,private方法,因为它们不会被覆盖,因此也不会出现上述调用子类中doSomething()方法的问题。