继承是 Java 面向对象编程的核心机制之一,然而子类与父类构造方法之间的调用关系,常常让开发者感到困惑。简单来说,子类虽然不能直接“调用”父类的构造方法,但它必须在自身的构造方法中,通过显式或隐式的方式触发父类的初始化逻辑——这是保证对象完整创建的前提。换句话说,每一个子类对象诞生之前,父类这块“地基”必须先行打好。

子类不能直接“访问”父类的构造方法,但必须通过 显式或隐式调用 父类构造方法来完成自身的实例化过程。这是 Java 对象初始化的强制规则:每个子类构造方法执行时,都必须确保父类部分被正确初始化。
子类构造方法默认调用父类无参构造方法
如果你在子类构造方法中没有书写 super(...),编译器会自动在最前面插入一句 super() —— 也就是调用父类的无参构造方法。这里有一个前提:父类确实存在一个可访问的无参构造(无论是默认提供的还是你显式定义的均可)。
- 如果父类只定义了带参构造(例如
public Parent(String name)),而且没有提供无参构造,子类又没有写super(...),那么编译器就会报错:“找不到合适的构造器”; - 举个例子:父类仅有
public Parent(String name),子类构造方法里如果不调用super(name),便会直接编译失败。
子类需用 super() 显式调用父类指定构造方法
当父类没有无参构造,或者你希望初始化父类的某些特定状态时,就必须在子类构造方法的第一行使用 super(...) 来指定要调用的父类构造,参数需要与父类某个构造方法的签名相匹配。
super()必须是子类构造方法中的第一条语句,不能写在中间或后面;- 只能出现一次,并且不能与
this(...)(调用本类其他构造)同时出现; - 比如
super("defaultName", 18);就是调用父类中Parent(String, int)的那个构造方法。
父类构造方法本身不可继承、不可重写、亦不可直接调用
构造方法本质上并非普通成员方法,它不参与继承机制:
- 子类不会“继承”父类的构造方法,你无法像普通方法那样直接覆盖;
- 不能使用
parentInstance.super(...)这种语法去调用; - 更不能给构造方法添加
@Override注解——它根本就不是一个可覆盖的方法。
常见误区提醒
实际开发中,有几个容易混淆的地方:
- 有人误以为
super是“父类构造方法的引用”,其实它只是触发父类构造逻辑的一条指令; - 有人习惯在构造方法中间或后面写
super(...),但编译器会直接拒绝; - 还有人把
super()当成普通方法,想要多次调用或条件调用——语法上根本不允许这样做。
请记住一条核心原则:子类构造方法的第一行,要么是 super(...)(显式指定),要么是隐式的 super()(默认),没有第三条路可走。理清这一点,继承机制下的初始化过程就不会再出问题。
