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