java中父子类静态代码块执行顺序为先父后子、只执行一次,按继承链自顶向下初始化,且仅在类首次主动使用时触发。

在 Java 中,父子类的静态代码块执行顺序严格遵循“先父后子、只执行一次”的原则,且与类加载过程强相关。
静态代码块的执行时机
静态代码块在类被首次主动使用(如创建实例、访问静态成员、反射调用等)而触发类加载时执行。JVM 保证每个类的静态代码块在整个程序生命周期中仅执行一次,且按类继承关系自顶向下初始化。
执行顺序规则
当子类首次被主动使用时:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- JVM 先加载并初始化父类(若尚未初始化),执行父类的静态变量赋值和静态代码块(按源码中出现顺序)
- 再加载并初始化子类,执行子类的静态变量赋值和静态代码块(同样按源码顺序)
- 同一类中,静态变量初始化和静态代码块按书写顺序从上到下执行
一个典型示例
假设代码如下:
class Parent {
static { System.out.println("Parent static block"); }
}
class Child extends Parent {
static { System.out.println("Child static block"); }
}
public class Test {
public static void main(String[] args) {
new Child(); // 第一次主动使用 Child
}
}
输出为:
Parent static blockChild static block
说明:new Child() 触发 Child 类加载 → 发现父类 Parent 未初始化 → 先执行 Parent 静态块 → 再执行 Child 静态块。
注意几个关键点
- 仅首次主动使用才触发静态初始化;后续 new 多个 Child 实例,静态块不再执行
- 直接访问父类静态字段(如 Parent.staticField)只会初始化 Parent,不会触发 Child 初始化
- 继承链多层时(A→B→C),执行顺序是 A → B → C
- 静态内部类的静态块不参与外层类继承链的初始化顺序
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










