Java继承中构造方法执行顺序固定为:父类非静态代码块→父类构造方法→子类非静态代码块→子类构造方法;该顺序由JVM严格控制,确保父类先完成初始化,子类再补充自身状态,且每次new对象时均按此单向链条执行。

Java 继承中构造方法的执行顺序是固定的,关键看“谁先初始化、谁依赖谁”。核心逻辑是:父类必须先完成初始化,子类才能在此基础上补充自己的状态。这个顺序不是靠猜,而是由 JVM 严格控制的运行时行为。
一、构造方法调用链是从父到子的单向链条
当你写 new Dog(),JVM 实际执行的是:
- 先找 Dog 的构造方法;
- 该构造方法第一行(无论你写没写)默认或显式调用 super() 或 super(...);
- 于是跳转到其直接父类(比如 Animal)的对应构造方法;
- 如果 Animal 构造方法里又有 super(),就继续向上,直到 Object;
- 然后逐层返回,执行完父类构造体后,再执行子类构造体剩余部分。
二、不写 super() 并不等于没调用——编译器会自动补
如果子类构造方法第一行没写任何 super(...) 或 this(...),编译器会在编译期自动插入 super()(即调用父类无参构造)。所以:
- 父类有无参构造 → 安全通过编译;
- 父类只有有参构造(比如 Animal(String name))→ 编译报错:“Implicit super constructor Animal() is undefined”;
- 此时必须手动写 super("xxx"),且必须是第一句。
三、完整对象初始化顺序不止构造方法
真正创建一个对象时,JVM 执行的是混合顺序,分两阶段:
立即学习“Java免费学习笔记(深入)”;
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 父类静态代码块
- 子类静态代码块
- 父类非静态代码块
- 父类构造方法
- 子类非静态代码块
- 子类构造方法
注意:静态代码块属于类,非静态代码块和构造方法属于实例,别混在一起看。
四、调试时怎么验证这个顺序?
最直接的办法是加打印语句,例如:
class A {
{ System.out.println("A 实例块"); }
A() { System.out.println("A 构造"); }
}
class B extends A {
{ System.out.println("B 实例块"); }
B() { System.out.println("B 构造"); }
}
运行 new B(),输出一定是:
- A 实例块
- A 构造
- B 实例块
- B 构造
这个输出就是最权威的执行证据,不需要背,动手跑一遍就清楚了。

















