java 构造器内部的多态方法和行为
如果要调用构造器内部的一个动态绑定方法,就要用到那个方法的被覆盖后的定义。然而,这个顶用的效果很难预料,因为被覆盖的方法在对象被完全构造之前就会调用。这一定会造成一些难以发现的错误。
class Base{ private String name = "base"; Base(){ tellName(); printName(name); } public void tellName(){ System.out.println("tellFather "+ name); } public void printName(String name){ System.out.println("printFather "+ name); } } class Drived extends Base{ private String name = "Drived"; Drived(){ tellName(); printName(name); } public void tellName(){ System.out.println("tellChild "+ name); } public void printName(String name){ System.out.println("printChild "+ name); } } public class TestObject { public static void main(String args[]){ new Drived(); } }
输出的结果如下:
tellChild null printChild base tellChild Drived printChild Drived
实际的初始化过程应该是这样的:
1. 在其他任何事物发生之前,将分配给对象的存储空间初始化为二进制的零。
2. 如上文一般,调用父类构造器,在父类构造器中会调用被子类覆盖的方法(如果有在构造器中调用了动态绑定的方法)。
3. 按照声明的顺序调用成员的初始化方法。
4. 调用子类的构造器。