超级构造函数调用

时间:2013-05-14 09:59:38

标签: java constructor subclass superclass

在Java中,如果我的类扩展了一个超类,并且默认情况下构造函数的第一行是Super(),那么超类的字段是初始化的,还是只是构造函数运行的?

此外,如果超类中的构造函数调用恰好在两个类中的方法,它是否运行超类或子类版本?

2 个答案:

答案 0 :(得分:9)

  

在Java中,如果我的类扩展了一个超类,并且默认情况下构造函数的第一行是Super(),那么超类的字段是否已初始化?或者只是构造函数运行?

在超类构造函数体运行之前,总是初始化超类的字段。

有关详细信息,请参阅JLS的section 15.9.4section 12.5

  

此外,如果超类中的构造函数调用恰好在两个类中的方法,它是否运行超类或子类版本?

假设子类方法实际上覆盖了超类1,则将调用子类实现。这通常被视为一件坏事,因为这意味着该方法不能依赖于子类构造函数初始化的任何东西。

答案 1 :(得分:0)

  

超类的字段已初始化,或者只是构造函数运行?

这是一回事。调用构造函数时会发生以下情况:

  1. 调用超类构造函数,除非当前类为java.lang.Object
  2. 执行带有初始值设定项和任何匿名初始值设定项{ }的实例变量声明。
  3. 执行(隐式或显式)super()调用之后的构造函数中的代码。
  4. 您可以在调用super()时通过递归看到,步骤(2)在步骤(3)之前。所以是的,实例变量被初始化并且执行构造函数代码。

      

    此外,如果超类中的构造函数调用恰好在两个类中的方法,它是否运行超类或子类版本?

    子类版本。请注意,这与C ++不同,其中对象被视为部分构造,同样是v-table,,因此将运行超类版本。