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