我正在查看我正在使用的一些代码,其中有一点特别让我印象深刻:
文件中有一个块:
public void prepare(){
if (this.GenericObjectID != null)
doStuff();
else{
this.GenericObjet = new GenericObject();
}
但是,当我查看
GenericObject.java
时,根本没有构造函数。代码运行了,但我没有编写它,所以我不确定如何运行(还!)。所以我的问题是:这怎么可能?当java编译器看到这个调用但文件中没有描述该对象的构造函数时,它在做什么?
如果没有显式构造函数,则编译器会创建一个不带参数的隐式默认构造函数,除了隐式调用超类构造函数之外什么也不做。
JLS第 8.8.9 节讨论了默认构造函数:
如果类不包含构造函数声明,则隐式声明默认构造函数。顶级类、成员类或局部类的默认构造函数的形式如下:
默认构造函数与类具有相同的可访问性(第 6.6 节)。
默认构造函数没有形式参数,但在非私有内部成员类中除外,其中默认构造函数隐式声明一个表示该类的直接封闭实例的形式参数(第 8.8.1 节、第 15.9.2 节、第 15.9 节) .3).
默认构造函数没有 throws 子句。
如果声明的类是原始类 Object,则默认构造函数的主体为空。否则,默认构造函数只是调用不带参数的超类构造函数。
new GenericObject();
是类 GenericObject
的默认构造函数。它由编译器自动创建,除非您在类中显式定义构造函数。
该构造函数将调用父类的构造函数,并将类成员变量初始化为其默认值。