静态初始化块仅在类首次主动使用时执行一次,即jvm类初始化阶段;触发条件包括:new实例、调用static方法、访问非编译期常量的static字段、class.forname反射加载、子类初始化时父类未初始化则先触发父类初始化。

静态初始化块只执行一次,在类首次被主动使用时触发,不是在类加载(Loading)阶段,而是在 JVM 的「类初始化」(Initialization)阶段执行。
什么时候算“首次主动使用”?
以下任一操作都会触发类初始化,从而执行静态初始化块:
- 创建该类的第一个实例(new 某个类的对象)
- 调用该类的任意一个 public static 方法
- 访问该类中非编译期常量的 public static 字段(例如
public static int PORT = 8080;;但public static final String NAME = "abc";不会触发) - 通过反射调用
Class.forName("ClassName") - 初始化某个类的子类(此时父类若未初始化,也会先触发父类的静态初始化)
执行次数为什么只能是一次?
JVM 规范保证:一个类的初始化过程最多只发生一次。一旦完成,后续所有对该类的主动使用都不会再次执行静态代码块。
- 哪怕反复 new 出成百上千个对象,静态块也绝不会重复执行
- 多个静态代码块按源码顺序依次执行,它们共同构成一次完整的初始化过程
- 若某个静态块抛出未捕获异常,该类会被标记为“初始化失败”,之后任何使用都会直接抛
ExceptionInInitializerError
它和实例初始化块的区别很关键
别把“静态初始化块”和“实例初始化块”(即不带 static 的 {})搞混:
- 静态块属于类级别,只与类初始化有关,跟对象数量无关
- 实例块属于对象级别,每次 new 对象时都执行一次,且严格位于构造器体之前
- 静态块不能访问
this或任何实例成员;实例块可以访问全部实例字段和方法
常见误区提醒
容易误以为“类一加载就执行”,其实不是:
- 类加载(Loading)只是把字节码读入方法区,不执行任何 Java 代码
- 真正执行静态块的是后续的「初始化」阶段,必须由主动使用行为触发
- 子类引用父类的静态字段(且该字段是编译期常量),也不会触发父类初始化











