静态代码块是类加载时自动执行且仅一次的初始化钩子,按声明顺序执行,父类优先于子类;可初始化静态资源但不可访问实例成员,常用于驱动注册、配置加载等一次性操作。

静态代码块在Java中是类加载阶段自动触发的一次性初始化钩子,不是方法、不能调用、也不依赖对象创建——它只随类首次被JVM加载而执行,且仅一次。
静态代码块的执行时机很明确
它不等你new对象,也不等你调main,只要类被首次主动使用,就会触发加载并执行:
- 第一次访问该类的静态变量(哪怕只是读取)
- 第一次调用该类的静态方法
- 用
new创建第一个实例 - 通过
Class.forName()反射加载类
一旦类完成加载,后续无论创建多少对象、调用多少次静态方法,静态代码块都不会再运行。
多个静态代码块按顺序执行
一个类里可以写多个static{},它们会严格按源码中从上到下的顺序依次执行:
- 父类的静态代码块先于子类执行
- 同一类中,靠前定义的静态块先执行,靠后定义的后执行
- 静态变量的直接赋值(如
static int x = 5;)也参与这个顺序,等效于隐式插入在对应位置的静态块中
能做什么、不能做什么,边界要清楚
静态代码块运行在“无实例”的上下文中,因此有明确限制:
- 可以访问静态变量和静态方法
- 不能访问实例变量、不能调用实例方法(编译报错)
- 不能使用
return语句(没有调用栈可返回) - 如果可能抛异常,必须用
try-catch处理,否则会导致类加载失败
典型使用场景其实很务实
它不是炫技工具,而是解决真实初始化问题的轻量机制:
- 初始化复杂静态变量:比如从配置文件读取参数后计算初始值
- 预加载资源:注册JDBC驱动、初始化缓存容器、建立共享连接池
- 单例模式保障:在类加载时就创建唯一实例,避免同步开销
- 校验环境或配置:检查必要系统属性是否存在,缺失则提前失败
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











