static代码块只执行一次,因其在类首次主动使用且未加载时由类加载器触发,属类初始化阶段,每个类仅执行一次;父类static块在子类加载前若被主动使用则先执行,子类static块仅在其首次主动使用时执行且不重复。

可以通过在父类和子类中分别定义 static 代码块,并配合类加载时机和输出语句来验证 static 代码块只执行一次。
static 代码块的执行时机
static 代码块在类被首次主动使用(如第一次 new 实例、调用静态方法、访问静态字段等)且该类尚未被加载时,由类加载器触发执行。它属于类初始化阶段,每个类只执行一次,与创建多少对象无关。
- 父类 static 块在子类首次加载前就可能被执行(如果父类先被主动使用)
- 子类 static 块仅在其自身被首次主动使用时执行,且只执行一次
- 重复 new 对象、调用实例方法,都不会再次触发 static 块
编写验证代码
定义一个父类和一个子类,各自包含带打印语句的 static 块:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
class Parent {
static { System.out.println("Parent static block"); }
}
class Child extends Parent {
static { System.out.println("Child static block"); }
}
然后在 main 方法中分步触发类加载:
- 先直接访问 Parent 的静态字段或方法(触发 Parent static)
- 再 new Child()(此时 Child 尚未加载,会先加载并初始化 Child,但 Parent 已初始化过,不再执行)
- 再次 new Child() 多次,观察 static 块是否重复输出
关键验证点
注意以下行为可确认“只执行一次”:
- 运行后,"Parent static block" 和 "Child static block" 各只输出一次
- 即使创建 10 个 Child 实例,static 块也不会多打印
- 如果先 new Child(),Parent static 块也会在 Child 初始化前自动执行(因继承关系需确保父类已初始化),但仍只执行一次
- 用 Class.forName("Child") 显式加载,效果等同于首次主动使用,同样只触发一次
排除干扰因素
避免误判的常见情况:
- 不要把 static 块和构造块({})、构造方法混淆——后者每次 new 都执行
- 确保没有其他地方提前引用了该类(比如其他类的静态字段类型是 Child,会导致类提前加载)
- 在 IDE 中运行时,注意某些热部署或测试框架可能多次加载类(应使用干净的 main 方法验证)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










