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

静态代码块在继承体系中执行顺序非常明确:先父类、后子类,且只执行一次。
静态代码块属于类加载阶段,与对象创建无关
只要某个类被首次主动使用(比如 new 子类、调用子类静态方法、访问子类静态字段),JVM 就会触发该类及其所有父类的加载和初始化。这个过程不依赖 new 对象,也不随对象数量增加而重复。
- 即使你只写 new Child(),JVM 也会先完整加载并初始化 Parent 类(执行其静态变量赋值和静态代码块)
- Parent 初始化完成后,才轮到 Child 的静态部分执行
- 后续无论 new 多少次 Child,或调用多少次 Child 的静态方法,静态代码块都不会再运行
同一类中多个静态代码块按源码顺序执行
如果一个类里写了多个 static {} 块,它们会从上到下依次执行,和静态变量显式赋值语句穿插在一起,共同构成该类的静态初始化逻辑。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 例如:static int a = initA(); 和 static { System.out.println("S1"); } 相邻,就按书写位置先后执行
- 编译器把它们统一编排进
方法,顺序不可跳过
多层继承时严格自顶向下逐级初始化
GrandParent → Parent → Child 这样的继承链,静态初始化也按此层级顺序展开,每一层都必须等上一层完成,才能开始自己的静态部分。
立即学习“Java免费学习笔记(深入)”;
- GrandParent 静态变量默认值 → GrandParent 静态块/赋值
- Parent 静态变量默认值 → Parent 静态块/赋值
- Child 静态变量默认值 → Child 静态块/赋值
调试建议:用带标识的日志锚定执行点
避免靠猜测判断顺序,直接在关键位置加日志:
- 每个静态代码块开头打印 [S] Parent 或 [S] Child
- 观察输出是否稳定为 S-P → S-C 模式
- 若出现乱序或重复,大概率是静态依赖循环、提前 new 本类实例,或某个 init() 抛异常中断了流程

















