You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

子类与父类均无显式构造函数却可实例化,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 03:52:16