参考java编程思想
在构造器内部调用正在构造的某个对象的某个动态绑定方法。即在基类构造器中调用被子类覆盖的方法。所以此方法所操纵的某个成员可能还未进行初始化。
public class A {
public A(){
System.out.println("A before");
this.f();
System.out.println("A After");
}
public void f(){
System.out.println("A::f()");
}
}
public class B extends A {
private int i=2;
public B(){
System.out.println("B before");
f();
System.out.println("B After");
}
public void f(){
System.out.println("B::f() i="+i);
}
}
<pre name="code" class="java">public class Other {
public Other(){
System.out.println("Creating Other");
}
public String toString(){
return "Other";
}
}
public class C extends B{
private int i=3;
private Other o=new Other();
public C(){
System.out.println("C Before");
f();
System.out.println("C After");
}
public final void f(){
System.out.println("C::f() i="+i+"\t"+o);
}
public static void main(String[] args){
C c=new C();
}
}
输出结果:
A before
C::f() i=0 null
A After
B before
C::f() i=0 null
B After
Creating Other
C Before
C::f() i=3 Other
C After
我们应该使用尽可能简单的方法构造对象,尽量避免调用其它方法。在构造器内唯一可以安全调用的方法是final方法,因为final方法不能被覆盖。