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. 调用子类的构造器。

  调用父类构造器的tellName方法时,动态绑定了子类的tellName方法,此时name为子类的域,值为为null。

  调用父类构造器的printName方法时,动态绑定了子类的printName方法,此时name作为参数传递进去,此时name为父类中的域,值为“base”

posted @ 2016-03-21 20:28  一直爬行的蜗牛  阅读(628)  评论(0编辑  收藏  举报