静态代码块在类首次被主动使用时执行一次,与实例数量无关;按源码顺序执行多个静态块;继承时按object→父类→子类顺序执行各自静态块且各仅一次。

静态代码块在多个实例中只执行一次,和创建多少个对象完全无关。
静态代码块属于类,不是对象
它在类首次被主动使用时(比如第一次 new、第一次访问静态字段、第一次调用静态方法),由 JVM 触发类加载过程并执行。此时还没有任何对象产生,所以它跟“实例数量”没有关系。
- 哪怕你 new 100 个对象,静态代码块也只在第一个对象创建(或类首次被使用)时执行一次
- 后续所有 new 操作都不会再次触发它
- 即使不创建任何实例,只要通过 Class.forName()、访问静态字段等方式主动使用类,它也会执行
多个静态代码块按书写顺序执行
一个类里可以定义多个 static {} 块,它们会严格按源码中出现的先后顺序执行,且全部在类加载阶段完成。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 例如:先声明的 static {} 输出 "A",后声明的输出 "B",结果一定是 A 然后 B
- 这个顺序不受构造逻辑或实例数量影响
- 多个静态块之间可以相互访问静态变量,但不能用 this 或非静态成员
继承场景下仍只执行一次,但有先后层级
子类继承父类时,静态代码块的执行遵循继承链自上而下,但每个类自己的静态块仍只执行一次。
- 先执行 Object → 父类 → 子类 的静态部分(按继承顺序)
- 父类静态块执行完,才轮到子类静态块
- 之后无论创建多少父类或子类实例,这些静态块都不会重复运行
常见误判点
容易混淆的是静态代码块和实例代码块的行为差异:
- 静态代码块:类加载时执行,一次,无对象上下文
- 实例代码块:每次 new 时执行,在构造方法前,依赖对象创建
- 不要因为看到 static {} 写在类里靠后位置,就以为它“晚执行”——执行时机只取决于类加载,不看位置
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










