静态代码块是Java中用于类加载时一次性初始化静态成员的机制,语法为static{},执行时机早于对象创建且仅一次,适用于复杂初始化场景,但需避免耗时操作和未捕获异常。

静态代码块是 Java 中初始化静态成员变量最常用、也最灵活的方式之一。它在类加载时自动执行,且仅执行一次,天然适配“类级别一次性初始化”的需求。
静态代码块的基本写法与执行时机
语法很简单:用 static 关键字加一对花括号,里面写初始化逻辑:
static { /* 初始化语句 */ }
这个块不带方法名、参数或返回值,也不能加 public/private 等修饰符。它会在类第一次被 JVM 加载时触发(比如首次 new 实例、首次调用静态方法、首次访问静态字段),早于任何对象创建,且整个生命周期只跑一遍。
立即学习“Java免费学习笔记(深入)”;
初始化静态变量的几种常见写法
静态成员变量可通过多种方式初始化,静态代码块是其中支持复杂逻辑的一种:
-
就地赋值:适合简单常量,如
public static final String VERSION = "1.0"; - 静态代码块:适合需要多步计算、异常处理、资源加载等场景,例如读配置、建缓存、注册驱动
- 静态方法调用:把初始化逻辑封装成 private static 方法,在声明时直接调用,语义更清晰,也便于单元测试
执行顺序与变量可见性
Java 按源码中出现的顺序依次执行静态字段初始化和静态代码块:
- 先执行
static int a = 10; - 再执行
static { b = a + 5; }(此时 a 已赋值,可读) - 若
static int b;声明在块之后,块内仍可给 b 赋值,但不能在块内引用未声明的变量
推荐把相关初始化集中在一个静态块里,避免跨块依赖导致顺序敏感问题。
典型使用场景与注意事项
静态代码块适合做那些“只做一次、全局生效”的准备动作:
- 预热一个
static final Map<String, Integer>映射表 - 加载数据库驱动:
Class.forName("com.mysql.cj.jdbc.Driver"); - 初始化连接池或全局配置缓存
要特别注意:
- 块内不能访问非 static 字段或方法(编译直接报错)
- 一旦抛出未捕获异常,类加载失败,后续所有对该类的引用都会触发
NoClassDefFoundError - 避免在块里做耗时操作(如远程调用、大文件读取),否则会拖慢整个类加载过程,影响应用启动


















