子类构造器必须首行调用super()以启动父类对象初始化,该调用强制且不可省略;JVM按字段默认值→实例代码块/成员变量初始化→构造器体顺序执行,并区分类初始化(static{})与对象初始化()。

子类初始化时,父类构造逻辑的执行不是自动“连带发生”的,而是由子类构造器中 super() 调用显式或隐式触发的。这个调用是强制性的、不可跳过,并且必须出现在子类构造器的第一行。
super() 是执行父类构造逻辑的唯一入口
Java 规定:每个子类构造器在执行自身逻辑前,必须先完成父类实例的初始化。JVM 通过以下方式保障这一点:
- 若子类构造器首行未显式写
super(...)或this(...),编译器会自动插入super()(调用父类无参构造器) - 若父类没有无参构造器,而子类又没显式调用
super(参数),编译直接报错 -
super()执行后,才会进入父类构造器体;父类构造器返回后,才继续执行子类构造器剩余内容
父类构造器内部也遵循完整初始化链
父类自己的构造逻辑并非从构造器第一行开始执行,而是严格按 JVM 实例化流程推进:
- 先为父类字段分配内存并设默认值(
int→0,Object→null) - 再执行父类的实例代码块(
{ ... })和成员变量显式初始化(如String name = "Tom";),二者按源码顺序混合执行 - 最后才真正运行父类构造器方法体内的代码
注意:这不是类初始化,而是对象初始化
要区分清楚两个不同阶段:
-
类初始化(
):执行static{}块,只发生一次,与super()无关;父类static{}是否执行,取决于它是否已被首次主动使用,而非子类 new 操作本身 -
对象初始化(
):每次new都发生,super()正是启动这一阶段的关键指令,它驱动父类的实例代码块 → 构造器 → 子类实例代码块 → 子类构造器这条固定流水线
一个容易踩坑的细节:父类构造器中调用可重写方法
如果父类构造器里调用了被子类重写的方法,此时子类的字段尚未初始化(仍为默认值),而实际执行的是子类方法体——这会导致读到 null 或 0 等未预期值。
这不是 super() 失效,而是设计风险:构造过程尚未走到子类字段赋值环节,但行为已暴露给子类。应避免在父类构造器中调用非 final 或非 private 方法。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











