Java多层继承中代码块执行分静态和实例两阶段:静态部分类加载时自上而下一次性执行,实例部分每次new时自顶向下进入、自底向上返回,且super()隐式调用确保父类构造先完成。

Java多层继承下,代码块执行不是简单“从上到下”,而是由类加载和对象创建两个阶段分层驱动:静态部分一次性完成、父类优先;实例部分每次new都走完整继承链、自顶向下进入、自底向上返回。
静态代码块:类加载时触发,严格按继承层级自上而下
JVM 加载最顶层父类时,就启动整个静态初始化流水线。后续子类哪怕没被直接 new,只要被间接引用(比如调用其静态方法),也会触发自身静态初始化——但前提是父类已初始化完毕。
- GrandParent 静态变量默认值 → GrandParent 静态块/显式赋值(按源码顺序)
- Parent 静态变量默认值 → Parent 静态块/显式赋值
- Child 静态变量默认值 → Child 静态块/显式赋值
这个过程只发生一次。哪怕你 new Child 十次,或调用 Child 的静态方法,静态块都不会再执行。
实例代码块与构造器:每次 new 时沿继承链逐层展开
真正创建对象时,JVM 会隐式插入 super() 调用,把控制权交给最顶层父类的构造流程。每层构造器执行前,先完成本类的实例变量赋值和普通代码块(即 {} 块)。
立即学习“Java免费学习笔记(深入)”;
- GrandParent 实例变量默认值 → GrandParent 普通代码块 → GrandParent 构造体
- Parent 实例变量默认值 → Parent 普通代码块 → Parent 构造体
- Child 实例变量默认值 → Child 普通代码块 → Child 构造体
注意:普通代码块写在类体里、构造器外,编译后会被“插入”到每个构造器开头(super() 之后、构造体之前)。所以它每次 new 都执行,且顺序固定。
关键细节:super() 是隐式起点,不是可选操作
子类构造器第一句永远是 super(...) 或 this(...)。没写?编译器自动补 super()。这意味着父类构造必须先完成,子类字段才可能被安全使用。
- 如果父类构造器里调用了被子类重写的方法,此时子类的普通代码块还没执行,字段仍是默认值(如 null、0)
- 这种“过早暴露未初始化状态”是常见空指针或逻辑错误根源
- 避免在父类构造器中调用可被重写的方法
实战验证技巧:用打印语句锚定执行点
不必死记顺序,靠三类标记快速定位:
- 静态块加前缀 "[static]",比如
System.out.println("[static] GrandParent"); - 普通代码块加前缀 "[init]",比如
{ System.out.println("[init] Parent"); } - 构造器体加前缀 "[ctor]",比如
public Parent() { System.out.println("[ctor] Parent"); }
运行 new Child() 后,输出自然呈现清晰的六段式节奏,一眼确认是否符合预期。


















