如果在一个构造方法的内部调用正在该类对象的其他还未初始化的方法,会有什么情况?
这里涉及到一个动态绑定的问题:在一般方法内部,动态绑定的调用是在运行才决定的,因为对象无法知道它是属于该方法所在的类,还是属于该方法所在的类的子类。
子类中覆盖父类的方法:那么调用构造器内部的一个动态绑定方法,就要用到哪个方法的被覆盖后的定义(这个调用效果是难以预料的,因为被覆盖的方法在对象被完全构造之前就会被调用)
class Demo11_1{
public void f(){
System.out.println("方法f");
}
public Demo11_1(){
System.out.println("Demo11_1的构造方法");
f();
}
}
class Demo11_2 extends Demo11_1{
public void f(){
System.out.println("覆盖的方法f");
}
public Demo11_2(){
System.out.println("Demo11_2的构造方法");
}
}
public class Demo11 {
public static void main(String[] args){
Demo11_2 my=new Demo11_2();
}
}
运行结果:
从结果可以看出出现的是已经被重写的方法
那么,为了避免上述情况,一般来说,在构造器内唯一能够安全调用那些方法是基类(父类)中的final方法(也适用于private方法,他们自动属于final方法)
父类构造方法中调用被子类重写的方法,会导致子类重写的方法无法访问到子类实例变量的值,因为此时这些变量还未初始化。(这一点也符合了上面说的,被覆盖的方法在对象被完全构造之前就已经先执行了)。
这里是对Java编程思想 8.3.3的理解,位于163页。