static代码块在类初始化阶段首次执行且仅一次,触发条件包括创建实例、调用静态方法、访问非final静态字段、反射加载(initialize=true)或子类初始化;jvm通过初始化标记保证线程安全与唯一性。

Java 中的 static 代码块 在类首次被主动使用时执行,且只执行一次。它不依赖对象创建,而是与类的加载和初始化阶段绑定,是控制类级初始化逻辑的重要机制。
static 代码块何时执行?
static 代码块在类的初始化阶段执行,具体发生在以下任一情况首次发生时:
- 创建该类的实例(如 new MyClass())
- 调用该类的静态方法(如 MyClass.staticMethod())
- 访问该类的静态字段(非 final 编译期常量,如 MyClass.count)
- 反射调用(如 Class.forName("MyClass"),且 initialize=true)
- 子类初始化时,若父类尚未初始化,会先触发父类初始化(包括其 static 块)
注意:类加载(Loading)阶段不会执行 static 块;只有进入初始化(Initialization)阶段才会执行。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
为什么只执行一次?
JVM 保证每个类的初始化过程最多执行一次,由虚拟机通过一个内部标记(initialization flag)控制。一旦类完成初始化,后续所有触发条件都不会再次执行 static 代码块。
- 多次 new 实例 → static 块仍只执行 1 次
- 反复调用静态方法或读写静态变量 → 不会重复触发
- 多个线程同时首次触发初始化 → JVM 保证仅有一个线程执行,其余阻塞等待
执行顺序与多个 static 块的处理
同一个类中多个 static 代码块,按它们在源码中出现的**自上而下顺序**依次执行,且全部在任何静态变量赋值语句(含显式初始化)之后、静态方法可被调用之前完成。
- 静态变量声明时的初始化表达式(如 static int x = getValue();)与 static 块同等地位,统一按文本顺序执行
- 父类 static 块总在子类 static 块之前执行
- 接口中没有 static 块(但 Java 8+ 支持 static 方法,其内部逻辑不触发类初始化)
典型误用与注意事项
static 代码块不是“程序启动就运行”,也不是“每次调用都执行”。常见误区包括:
- 误以为 main 类的 static 块在 JVM 启动瞬间执行 → 实际在 main 方法被调用前才初始化
- 在 static 块中抛出异常未捕获 → 导致 ExceptionInInitializerError,此后任何对该类的引用都会失败
- 依赖外部资源(如文件、网络)且未做容错 → 类可能永久处于“初始化失败”状态,无法再次尝试
- 与 static 字段初始化顺序混淆 → 避免在 static 块中读取尚未初始化的静态字段(尤其是跨块定义时)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










