覆盖从构造函数调用的方法

时间:2013-09-14 18:53:03

标签: java override

如果创建了子类的实例,则输出为sub0 sub2

有两个问题:

  • 为什么即使超类构造函数没有完成,也会调用子类方法?

  • 为什么从超类构造函数(sub0输出)调用时,实例字段未初始化?

示例:

class Superclass{
   int i = 1;

    Superclass(){
      aMethod();
    }
   void aMethod(){
      System.out.println("super" + i);
   }
}

class Subclass extends Superclass{
   int i = 2;

   Subclass(){
   aMethod();
   }

   void aMethod(){
      System.out.println("sub" + i);
   }
}

1 个答案:

答案 0 :(得分:7)

  

为什么调用子类方法,即使超类构造函数没有完成?

因为已经在那个时间点创建了子类的实例。刚刚调用超类构造函数来初始化对象的状态。现在,由于实例实际上是子类的实例(我假设你只讨论这种情况),所调用的实际方法将是被覆盖的实例(方法覆盖规则适用于此处)。

  

为什么在从超类构造函数(sub0输出)调用时,实例字段未初始化?

因为,子类构造函数尚未启动初始化部分。它是首先执行的超类构造函数。因此,如果从超类构造函数调用子类中的重写方法,则子类的字段尚未初始化,i的值仍为0

另见: