子类构造方法执行前必先完成父类初始化,编译器自动插入super()调用(前提是父类有无参构造),该调用强制位于第一行;若父类无无参构造且子类未显式调用super(...),则编译失败。

子类构造方法在执行前,一定会先完成父类的初始化。Java编译器会在子类每个构造方法的第一行,自动插入一条 super() 调用——前提是父类存在无参构造方法。
隐式调用不是“可选”,而是强制发生的编译规则
只要子类构造方法里没写任何 super(...) 或 this(...),编译器就悄悄帮你补上 super()。它不是运行时行为,而是在编译阶段就确定的语法要求。
- 这个调用必须是构造方法中的第一条语句(哪怕你没写,它也占着第一行位置)
- 如果父类根本没有无参构造方法(比如只定义了
Parent(String name)),而子类又没显式写super("xxx"),编译直接失败 - 即使子类构造方法带参数,比如
Child(int x),默认仍调用父类无参构造,不是按参数匹配
父类无参构造方法从哪来?分两种情况
父类是否拥有无参构造,取决于它自己有没有“动手写”:
- 如果父类一个构造方法都没定义,编译器会自动生成一个空的无参构造(隐式默认构造)
- 只要父类写了任意一个构造方法(哪怕只是
Parent() { }或Parent(int i)),编译器就不再生成隐式无参构造 - 所以,一旦父类加了带参构造,又没同时写个无参构造,子类就必须显式调用
super(...)
验证方式:看输出顺序最直观
写个简单例子就能看清执行链:
立即学习“Java免费学习笔记(深入)”;
class A { A() { System.out.print("A"); } }
class B extends A { B() { System.out.print("B"); } }
// new B() 输出:AB
说明创建 B 实例时,先走完 A(),再执行 B() 的主体。中间没有你写的代码,但逻辑上就是 super() 在起作用。
什么时候必须写 super(...)?
当父类没有无参构造时,别无选择:
- 父类只有
Parent(String name)→ 子类构造中必须写super("xxx") - 父类有多个构造,你想调用特定的一个(比如带日志初始化的)→ 显式写
super(...)更清晰可控 - 想避免依赖父类是否保留无参构造(提高健壮性)→ 主动写
super()或对应参数版本


















