【问题标题】:Overriding a method that is called from a constructor覆盖从构造函数调用的方法
【发布时间】:2013-09-14 18:53:02
【问题描述】:

如果创建了子类的实例,则输出为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);
   }
}

【问题讨论】:

    标签: java overriding


    【解决方案1】:

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

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

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

    因为,子类构造函数还没有开始初始化部分。首先执行的是超类构造函数。所以,如果从超类构造函数中调用子类中被覆盖的方法,子类的字段还没有被初始化,i的值仍然是0

    另请参阅:

    【讨论】:

      猜你喜欢
      • 2013-03-01
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      • 2016-02-27
      相关资源
      最近更新 更多