子类构造函数默认隐式调用父类无参构造函数;若父类无可用无参构造器,则必须显式调用super(…)或补充无参构造器,且super()必须位于首行。

子类构造函数默认隐式调用父类无参构造函数
只要子类构造函数中没写任何 super(...) 或 this(...),Java 编译器就会在该构造函数的第一行自动插入 super()。这个调用是隐式的,你代码里看不见,但执行时一定发生。
前提是父类必须存在一个可访问的无参构造函数——可以是编译器自动生成的默认构造器(当父类没定义任何构造器时),也可以是你手动写的 public Parent() { ... }。
- 如果父类只写了带参构造器,没写无参构造器,那它的默认无参构造器就被“屏蔽”了
- 此时子类隐式调用 super() 就会编译失败,报错类似 “Constructor Parent() is undefined”
- 这种情况下,必须改成显式调用父类带参构造器,或给父类补上无参构造器
显式调用父类无参构造函数的方式
在子类构造函数第一行写 super(),就是显式调用父类无参构造函数。它和隐式调用效果一样,只是把编译器自动做的事写出来了,便于阅读和控制。
注意:super() 必须是构造函数中的第一条语句;不能出现在其他位置,也不能和 this(...) 同时出现(二者都必须独占首行)。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 写
super();后,后续代码才执行子类自己的初始化逻辑 - 即使父类无参构造器是空的,显式写出
super();也能让意图更清晰 - 多个子类构造器中,每个都需要独立处理:要么靠隐式,要么靠显式
super()或super(参数)
什么时候不能依赖隐式调用?
当父类没有无参构造函数时,隐式调用必然失败。常见场景包括:
- 父类只定义了带参构造器(比如
public Person(String name)),没写无参版本 - 父类的无参构造器被声明为
private,子类无法访问 - 父类继承自另一个类,而那个类的无参构造器不可用
这时子类每个构造器都必须以 super(…) 开头,并传入匹配的参数,否则编译不通过。
验证调用顺序的小技巧
在父类和子类的构造器里加打印语句,能直观看到执行流程:
class A { A() { System.out.println("A()"); } }
class B extends A { B() { System.out.println("B()"); } }
// new B() 输出:A() → B()
这说明无论有没有写 super(),父类构造器总在子类之前执行——这是 Java 初始化链的硬性规则。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










