静态代码块在类初始化阶段执行且仅一次,用于驱动注册、配置加载等类级一次性初始化,按声明顺序执行、线程安全,异常会导致类初始化失败。

Java静态块在类加载阶段就完成执行,是类环境准备的核心环节。它不依赖对象创建,只运行一次,直接参与类的初始化过程,对静态资源、配置、驱动等关键要素的就位起决定性作用。
确保静态资源一次性就绪
静态块最直接的价值是让那些“只该做一次”的操作,在类刚被JVM加载时就准确完成。比如数据库驱动注册、日志框架初始化、全局缓存预热等,都必须在任何实例产生前就位。
- 驱动注册:Class.forName("com.mysql.cj.jdbc.Driver") 放在静态块里,避免每次新建连接都重复触发
- 常量映射:将枚举与字符串/数字的双向映射表(如 Map<String, Status>)在静态块中构建并赋值给 static final 字段
- 本地库加载:System.loadLibrary("nativeLib") 必须在类加载时执行,否则后续 native 方法调用会抛 UnsatisfiedLinkError
支撑复杂静态变量的可靠初始化
当静态变量无法用简单字面量或单表达式初始化时,静态块提供了完整的执行上下文。它能调用私有静态方法、处理异常、读取文件或网络资源,而这些能力是字段直接赋值所不具备的。
- 配置加载:从 classpath 下读取 application.properties,解析后注入 static Map<String, String> config
- 安全密钥初始化:从密钥库加载 RSA 公钥,并转换为 PublicKey 对象,整个流程封装在静态块内
- 线程安全单例预热:在静态块中创建并初始化一个 static final ExecutorService,供全类复用
明确控制类加载时的执行顺序
多个静态块按源码书写顺序依次执行,且早于静态变量赋值语句(除非变量声明带初始化表达式)。这种可预测的顺序,是构建依赖链的基础。
立即学习“Java免费学习笔记(深入)”;
- 先加载基础配置,再基于配置初始化业务规则引擎
- 先设置默认超时时间(static int TIMEOUT),再用该值构造 HttpClient 实例(static final CloseableHttpClient)
- 静态块中可安全调用本类其他静态方法,但不能访问非静态成员——这是编译器强制保障的边界
与构造器、实例块形成清晰职责分层
静态块负责“类级准备”,实例块和构造器负责“对象级准备”。这种分离让代码意图一目了然,也避免常见错误,比如把本该全局共享的资源放在构造器里反复创建。
- 错误做法:在构造器中 new SimpleDateFormat() —— 导致线程不安全且浪费内存
- 正确做法:在静态块中创建 static final DateTimeFormatter,安全复用
- 典型协作链:静态块加载配置 → 实例块设置默认状态 → 构造器接收参数定制行为


















