<p>static关键字用于定义类级别成员,静态代码块在类加载时自动执行一次,适合做类的初始化工作;其语法为static { / 初始化语句 / },按源码顺序执行,常用于初始化static字段、加载驱动、预热缓存等,但不可访问非static成员,抛异常会导致类加载失败。</p>

static 关键字用于定义类级别成员,静态代码块在类加载时自动执行一次,适合做类的初始化工作。
静态代码块的基本写法
静态代码块用 static 关键字加一对花括号定义,不带方法名、参数和返回值,不能加访问修饰符:
- 语法格式:static { /* 初始化语句 */ }
- 它在类第一次被加载进 JVM 时执行,且仅执行一次
- 多个静态代码块按出现顺序依次执行
- 常用于初始化 static 字段、加载驱动、预热缓存等
静态代码块与静态字段初始化的顺序
Java 按源码中声明顺序执行静态字段赋值和静态代码块。例如:
- 先执行 static int a = 10;
- 再执行 static { b = a + 5; }
- 最后执行 static int b;(若 b 声明在块之后,则块内可读 a,但不能直接给未声明的 b 赋值)
- 推荐把相关初始化逻辑集中到一个静态块中,避免顺序依赖出错
静态代码块的实际应用场景
它不依赖对象实例,适合一次性、全局性准备操作:
立即学习“Java免费学习笔记(深入)”;
- 数据库连接池初始化(如 HikariCP 配置加载)
- 读取配置文件并缓存为 static final Map
- 注册 JDBC 驱动(Class.forName("com.mysql.cj.jdbc.Driver"))
- 预设枚举映射表或常量集合(如 static Map
CODE_MAP = new HashMap(); )
注意点与常见误区
静态代码块看似简单,但容易引发隐性问题:
- 不能访问非 static 成员(编译报错)
- 抛出异常会导致类加载失败,后续所有对该类的引用都会触发 NoClassDefFoundError
- 不建议在其中执行耗时操作(如网络请求、大文件读取),会阻塞类加载,影响启动性能
- 若需更灵活控制,可封装为 private static 方法,在静态块中调用


















