首页 文章

超级构造函数调用

提问于
浏览
1

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

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

2 回答

  • 0

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

    在超类构造函数体运行之前,始终初始化超类的字段 .

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

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

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

  • 9

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

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

    • 调用超类构造函数,除非当前类是 java.lang.Object .

    • 执行带有初始值设定项和任何匿名初始值设定项 { } 的实例变量声明 .

    • 执行(隐式或显式) super() 调用之后的构造函数中的代码 .

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

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

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

相关问题