静态代码块用于类加载时一次性执行复杂初始化,适合需异常处理、读取配置等场景,按源码自上而下顺序执行,优先于静态变量声明,且仅运行一次。

静态代码块用于在类加载时执行一次初始化逻辑,适合处理那些无法用简单赋值完成的类级(static)变量初始化,比如需要多步计算、读取配置、建立连接等场景。
静态代码块的基本写法
用 static 关键字加一对大括号定义,它不属于任何方法或实例,只在类第一次被加载(如首次访问该类的静态成员、创建实例、或显式调用 Class.forName())时执行,且仅执行一次。
示例:
public class Config {
public static final String APP_NAME;
public static final int MAX_RETRY;
static {
// 可以做复杂初始化:读系统属性、解析字符串、异常处理等
APP_NAME = System.getProperty("app.name", "default-app");
String retryStr = System.getProperty("max.retry", "3");
try {
MAX_RETRY = Integer.parseInt(retryStr);
} catch (NumberFormatException e) {
MAX_RETRY = 3;
}
}
}
静态代码块与静态变量声明的顺序很重要
Java 按照源码中出现的**自上而下顺序**执行静态变量初始化和静态代码块。先声明的先初始化,后声明的可引用前面已初始化的静态变量;反之则编译报错(非法前向引用)。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- ✅ 正确:静态变量声明在前,静态块在后,块中可安全使用该变量
- ❌ 错误:静态块中直接给尚未声明的 static 变量赋值(即使后面会声明),编译不通过
- ⚠️ 注意:多个静态块按书写顺序依次执行,可用于分段初始化不同模块
什么情况下优先用静态代码块而不是直接赋值?
当初始化逻辑涉及以下情况时,静态代码块更合适:
- 需要异常处理(如文件读取、网络请求失败时提供默认值)
- 依赖其他静态资源(如读取
Properties文件、解析 JSON 配置) - 执行有副作用的操作(如注册监听器、初始化线程池、加载本地库)
- 需多行逻辑或条件分支(例如根据环境选择不同配置)
替代方案对比:静态方法 vs 静态代码块
有时也会把初始化逻辑封装成 private static 方法再调用,效果类似:
private static String loadAppName() {
return System.getProperty("app.name", "default-app");
}
public static final String APP_NAME = loadAppName();
这种方式更易测试、可复用,但要注意:它仍受初始化顺序限制,且不能包含 try-catch(除非方法内部处理)。若逻辑复杂或需捕获异常,静态代码块更直观可控。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










