1

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

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

4

2 回答 2

9

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

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

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

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

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

于 2013-05-14T10:02:15.633 回答
0

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

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

  1. 调用超类构造函数,除非当前类是java.lang.Object.
  2. 执行带有初始化程序和任何匿名初始化程序的实例变量声明{ }
  3. 执行(隐式或显式)super()调用之后的构造函数中的代码。

您可以在调用 时通过递归看到super(),步骤 (2) 在步骤 (3) 之前。所以是的,实例变量被初始化执行构造函数代码。

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

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

于 2013-05-14T10:59:23.930 回答