Java中的每个构造函数是否隐式调用Object的构造函数?

nme*_*eln 8 java constructor class

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

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

难道Object甚至有一个构造函数?

rge*_*man 8

是的,必须明确或隐式地调用每个超类的构造函数Object.每个类必须构造其对象的一部分,包括Object.

JLS,第8.8.7规定:

如果构造函数体不以显式构造函数调用开始并且声明的构造函数不是原始类Object的一部分,那么构造函数体隐式地以超类构造函数调用"super();"开头,这是对构造函数的调用.它的直接超类不带参数.

每个构造函数都调用它的直接超类构造函数,该构造函数调用其直接超类构造函数,直到调用构造Object函数.

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

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

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

无论哪种方式,超类构造函数都将被一直调用Object.

编译器而不是JVM将隐式调用插入到超类构造函数中.使用没有显式构造函数的do-nothing类:

public class DoNothing {}
Run Code Online (Sandbox Code Playgroud)

这是字节码:

$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
}
Run Code Online (Sandbox Code Playgroud)

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