【问题标题】:Does every constructor in Java implicitly call Object's constructor?Java 中的每个构造函数都隐式调用 Object 的构造函数吗?
【发布时间】:2015-09-19 01:37:09
【问题描述】:

我知道如果类不扩展任何其他类,那么它会隐式扩展Object 类。

这是否意味着当我调用我的类构造函数时,基类Object 的构造函数也会被调用?

Object 有构造函数吗?

【问题讨论】:

    标签: java class constructor


    【解决方案1】:

    是的,每个超类的构造函数都必须被显式或隐式调用,一直到Object。每个类都必须构造其对象的一部分,包括Object

    JLS, Section 8.8.7,声明:

    如果构造函数体不是以显式构造函数调用开始,并且被声明的构造函数不是原始类 Object 的一部分,则构造函数体隐式以超类构造函数调用“super();”开始,调用其直接超类的构造函数,不带参数。

    每个构造函数调用其直接超类构造函数,后者调用其直接超类构造函数,直到调用Object 的构造函数。

    但是如果你根本没有在类中声明构造函数呢?默认构造函数是隐式创建的,根据JLS, Section 8.8.9

    如果一个类不包含构造函数声明,则隐式声明一个默认构造函数。

    如果声明的类是原始类 Object,则默认构造函数的主体为空。否则,默认构造函数只会调用不带参数的超类构造函数。

    无论哪种方式,超类构造函数都会被调用到Object

    编译器,而不是 JVM,插入对超类构造函数的隐式调用。使用没有显式构造函数的无操作类:

    public class DoNothing {}
    

    这是字节码:

    $javap -c DoNothing.class
    Compiled from "Main.java"
    class DoNothing {
      DoNothing();
        Code:
           0: aload_0
           1: invokespecial #1         // Method java/lang/Object."<init>":()V
           4: return
    }
    

    Object的构造函数的调用在字节码中是显式的。

    【讨论】:

    • 有趣的事实:JVM 确实需要这个。
    • 在解释字节码时是编译器处理还是JVM处理?
    • @JamesWierzba 编译器。请参阅我修改后的答案。
    猜你喜欢
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 2012-09-02
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多