子类与父类均无显式构造函数却可实例化,Java教程是否有误?
为什么无显式构造函数的子类能正常编译?
引用教程内容
您无需为类提供任何构造函数,但这样做时必须谨慎。编译器会自动为没有构造函数的类提供一个无参默认构造函数。该默认构造函数会调用父类的无参构造函数。在这种情况下,如果父类没有无参构造函数,编译器会报错,因此您必须确认父类存在无参构造函数。
测试代码
public class Humanoid { int weight; //public Humanoid() { //weight = 10; //} } class Goblin extends Humanoid { char armorColor; } class Driver { public static void main(String[] args) { Goblin grug = new Goblin(); System.out.println(grug.armorColor); boolean isGrugAGoblin = false; isGrugAGoblin = (grug instanceof Goblin); System.out.println(isGrugAGoblin); } }
代码能正常编译的原因
教程的说法没有错误,你误解了它描述的触发报错的场景:
- 当一个类没有任何显式构造函数时,Java编译器会自动为它生成一个无参默认构造函数。你的
Humanoid类就属于这种情况,编译器自动生成了public Humanoid() {}。 - 子类
Goblin同样没有显式构造函数,编译器也为它生成了无参默认构造函数,这个构造函数的第一行默认调用super()(父类的无参构造函数)。由于父类的无参构造函数存在(编译器自动生成的),所以编译完全合法,不会报错。
教程中提到的“编译器会报错”,是指父类存在显式构造函数,但未定义无参构造函数的场景。比如如果Humanoid只定义了带参构造函数:
public class Humanoid { int weight; public Humanoid(int weight) { this.weight = weight; } }
此时编译器不会为Humanoid生成无参默认构造函数,子类Goblin的默认构造函数调用super()时找不到父类的无参构造函数,这时候才会触发编译错误,和教程描述完全一致。
关于输出结果
你看到的输出是:
true
其中第一行是空行,因为grug.armorColor是char类型,它的默认值是\u0000(空字符),打印这个字符时不会显示可见内容,只会输出一个换行,之后才是true,这符合Java成员变量的默认值规则。
内容的提问来源于stack exchange,提问作者Derek Dilger
相关产品推荐
相关产品推荐

