静态代码块执行顺序由JVM类初始化机制严格规定:父类静态变量赋值→父类静态代码块→子类静态变量赋值→子类静态代码块,仅在类首次主动使用时执行一次,编译期常量访问除外。

静态代码块加载顺序由JVM类初始化机制决定
Java中静态代码块(static{})的执行不是靠代码位置或手动控制,而是JVM在类首次被主动使用时,按继承链自顶向下、严格同步完成的。父类静态部分必须全部执行完毕,子类静态部分才开始——这个顺序是JVM强制保障的,无法绕过或调整。
触发时机决定整个初始化链是否启动
只要子类被首次主动使用(比如 new Child()、调用 Child.staticMethod()、访问非编译期常量的 Child.STATIC_FIELD),JVM就会立即启动从顶层父类(如Object)开始的完整静态初始化流程:
- 先执行父类所有静态变量赋值(按声明顺序)
- 再执行父类所有静态代码块(按源码书写顺序)
- 然后执行子类所有静态变量赋值
- 最后执行子类所有静态代码块
整个过程只发生一次,后续无论创建多少对象或调用多少次静态方法,都不会重复执行。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
编译期常量是唯一例外
像 public static final int VERSION = 1; 这类基本类型字面量常量,属于编译期常量。直接访问它不会触发任何类初始化,静态代码块也不会运行。但如果静态字段依赖运行时计算,例如 public static final String CONF = loadConfig();,就会正常触发整个初始化链。
立即学习“Java免费学习笔记(深入)”;
接口不影响类的静态块执行流
一个类可以实现多个接口,但接口里不能定义 static{} 块。接口中的静态字段或静态方法只有在被主动使用时才会单独初始化,且不会插入到当前类的静态执行序列中。子类继承父类并实现多个接口时,静态块仍严格按 父类 → 子类 的顺序执行,接口不参与该流程。

















