父类构造器一定会执行,且严格按继承链从object开始逐级调用至子类;每次new都触发父类先于子类的构造器链,super()必须为首条语句,否则编译失败。

子类实例化时,父类构造器一定会执行,且严格按继承链从上到下依次触发——从 Object 开始,逐级调用到当前子类。这不是可选行为,而是 JVM 在字节码层面强制保障的初始化规则。
执行顺序固定:父类先于子类
每次 new 一个子类对象,JVM 执行流程如下:
- 分配内存(但尚未初始化字段)
- 立即启动构造器链:先调用最顶层父类(
Object)的构造器 - 然后是直接父类的构造器
- 最后才是子类自己的构造器体
这个顺序不可跳过、不可颠倒、也不可优化。哪怕父类构造器为空,它也必须被调用。
super() 是入口,且必须在第一行
子类构造器中,super() 或 super(…) 必须是第一条可执行语句:
- 没写
super()?编译器自动补super();(仅当父类有可访问的无参构造器) - 父类只有带参构造器?必须显式写
super(x, y),否则编译失败,报错如:"Implicit super constructor XXX() is undefined" - 不能在
super()前做任何事:声明变量、调用非静态方法、使用this、instanceof都会直接编译报错
参数预处理可以,但得绕开 this
如果需要对传入参数加工后再交给父类,可以用静态方法封装:
-
super(trimInput(name))✅ 允许,因为trimInput是静态的,不依赖未初始化的this -
super(this.getName())❌ 不允许,此时this还没完成父类初始化,JVM 禁止访问
多层继承和异常传播
比如 A → B → C 的继承链:
- 创建
C实例时,执行顺序一定是:A()→B()→C() - 若
A()中抛出异常,整个实例化立即终止,B()和C()的后续代码都不会执行 - 父类构造器里调用的、被子类重写的方法,实际执行的是子类版本——但此时子类字段仍是默认值(
null、0等),容易引发空指针或逻辑错误
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











