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

时间:2015-07-01 18:33:51

标签: java class constructor

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

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

Object是否有构造函数?

1 个答案:

答案 0 :(得分:8)

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

JLS, Section 8.8.7,声明:

  

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

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

但是如果你没有在类中声明一个构造函数呢?根据{{​​3}}:

隐式创建默认构造函数
  

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

  

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

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

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

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的构造函数的调用在字节代码中是显式的。