静态代码块执行顺序为父类先于子类且仅执行一次:jvm首次主动使用子类时,先自顶向下完成父类静态变量赋值和静态代码块(按源码顺序),再执行子类对应部分,后续调用不再重复。

静态代码块在继承体系中执行顺序非常明确:先父类、后子类,且只执行一次。
静态代码块属于类加载阶段,与对象创建无关
只要某个类被首次主动使用(比如 new 子类、调用子类静态方法、访问子类静态字段),JVM 就会触发该类及其所有父类的加载和初始化。这个过程不依赖 new 对象,也不随对象数量增加而重复。
- 即使你只写 new Child(),JVM 也会先完整加载并初始化 Parent 类(执行其静态变量赋值和静态代码块)
- Parent 初始化完成后,才轮到 Child 的静态部分执行
- 后续无论 new 多少次 Child,或调用多少次 Child 的静态方法,静态代码块都不会再运行
同一类中多个静态代码块按源码顺序执行
如果一个类里写了多个 static {} 块,它们会从上到下依次执行,和静态变量显式赋值语句穿插在一起,共同构成该类的静态初始化逻辑。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如:static int a = initA(); 和 static { System.out.println("S1"); } 相邻,就按书写位置先后执行
- 编译器把它们统一编排进
方法,顺序不可跳过
多层继承时严格自顶向下逐级初始化
GrandParent → Parent → Child 这样的继承链,静态初始化也按此层级顺序展开,每一层都必须等上一层完成,才能开始自己的静态部分。
- GrandParent 静态变量默认值 → GrandParent 静态块/赋值
- Parent 静态变量默认值 → Parent 静态块/赋值
- Child 静态变量默认值 → Child 静态块/赋值
调试建议:用带标识的日志锚定执行点
避免靠猜测判断顺序,直接在关键位置加日志:
- 每个静态代码块开头打印 [S] Parent 或 [S] Child
- 观察输出是否稳定为 S-P → S-C 模式
- 若出现乱序或重复,大概率是静态依赖循环、提前 new 本类实例,或某个 init() 抛异常中断了流程
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










