java继承中构造函数执行顺序是先父后子、从上到下:首次new时先执行父类静态块→子类静态块,随后每次new都按父类字段初始化→父类代码块→父类构造函数→子类字段初始化→子类代码块→子类构造函数的顺序执行。

Java 继承中构造函数执行顺序,核心就一条:从上到下、先父后子。不是代码写在前面就先执行,而是由 JVM 严格按继承链层级决定——最顶层父类最先开始,逐级向下,直到当前 new 的那个子类。
父类构造函数一定最先执行
每次 new 一个子类对象时,JVM 会自动确保其所有直接或间接父类的构造函数都已执行完毕。这个过程是强制的:
- 如果子类构造函数没写 super(...),编译器会悄悄插一句 super()(调用父类无参构造)
- 如果父类没有无参构造,子类就必须显式写 super(参数),且必须是第一行
- 哪怕父类构造函数里调用了被子类重写的方法,此时子类字段仍为默认值(如 int 是 0,引用是 null),因为子类自己的初始化还没开始
静态内容优先于实例内容
整个对象创建过程分两阶段:类加载阶段和实例化阶段。静态部分只执行一次,且早于任何对象诞生:
- 首次使用该类(比如 new 第一个对象)时,先执行 父类静态代码块 → 子类静态代码块
- 之后每次 new 对象,才进入实例化流程:父类构造代码块 → 父类构造函数 → 子类构造代码块 → 子类构造函数
- 注意:构造代码块({ ... })和字段初始化表达式,都在构造函数体执行前完成,但顺序固定,不受你写在代码哪一行影响
字段初始化发生在构造函数体之前
很多人误以为字段赋值是在构造函数里做的,其实更早:
- 对象内存分配后,所有字段先被设为默认值(0、false、null)
- 然后按声明顺序执行父类的字段初始化和构造代码块
- 再执行父类构造函数体
- 接着是子类字段初始化和构造代码块
- 最后才是子类构造函数体里的语句
委托构造(this())和继承构造(super())不能共存
同一个构造函数里,只能选一个“第一行调用”:
- 写了 this(...),就不能再写 super(...);反之亦然
- this(...) 是调用本类其他构造函数,属于“横向委托”,它内部仍会走 super 链
- 真正触发父类构造的,永远是链条里最顶端那个未被 this 委托的构造函数
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











