在 Java 中,如果我的类扩展了一个超类,并且默认情况下构造函数的第一行是Super()
,超类的字段是否已初始化,或者只是构造函数运行?
另外,如果超类中的构造函数调用了恰好在两个类中的方法,它是运行超类还是子类版本?
在 Java 中,如果我的类扩展了一个超类,并且默认情况下构造函数的第一行是Super()
,超类的字段是否已初始化,或者只是构造函数运行?
另外,如果超类中的构造函数调用了恰好在两个类中的方法,它是运行超类还是子类版本?
在 Java 中,如果我的类扩展了一个超类,并且默认情况下构造函数的第一行是 Super(),那么超类的字段是否已初始化?还是只是构造函数运行?
超类的字段总是在超类构造函数体运行之前初始化。
有关详细信息,请参阅JLS 的第 15.9.4 节和第 12.5 节。
另外,如果超类中的构造函数调用了恰好在两个类中的方法,它是运行超类还是子类版本?
假设子类方法实际上覆盖了超类方法,则将调用子类实现。这通常被视为一件坏事,因为这意味着该方法不能依赖于由子类构造函数初始化的任何内容。
超类的字段已初始化,还是只是构造函数运行?
这是同一件事。调用构造函数时会发生以下情况:
java.lang.Object
.{ }
。super()
调用之后的构造函数中的代码。您可以在调用 时通过递归看到super()
,步骤 (2) 在步骤 (3) 之前。所以是的,实例变量被初始化并执行构造函数代码。
另外,如果超类中的构造函数调用了恰好在两个类中的方法,它是运行超类还是子类版本?
子类版本。请注意,这与将对象视为部分构造的 C++ 不同,同上,v-table,
因此将运行超类版本。