【发布时间】:2015-09-19 01:37:09
【问题描述】:
我知道如果类不扩展任何其他类,那么它会隐式扩展Object 类。
这是否意味着当我调用我的类构造函数时,基类Object 的构造函数也会被调用?
Object 有构造函数吗?
【问题讨论】:
标签: java class constructor
我知道如果类不扩展任何其他类,那么它会隐式扩展Object 类。
这是否意味着当我调用我的类构造函数时,基类Object 的构造函数也会被调用?
Object 有构造函数吗?
【问题讨论】:
标签: java class constructor
是的,每个超类的构造函数都必须被显式或隐式调用,一直到Object。每个类都必须构造其对象的一部分,包括Object。
如果构造函数体不是以显式构造函数调用开始,并且被声明的构造函数不是原始类 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的构造函数的调用在字节码中是显式的。
【讨论】: