java静态变量初始化有两种主要方式:一是声明时直接赋值,适用于值确定、逻辑简单的场景;二是使用静态代码块,适用于需复杂逻辑、异常处理或批量初始化的场景,二者均在类加载时执行且仅一次。

Java 中静态变量的初始值设定有明确规则和多种可行方式,核心在于理解“何时赋值”和“怎么赋值”两个层面。静态变量属于类,不是对象,因此它的初始化发生在类加载阶段,且只执行一次。
声明时直接赋值
最常见也最简洁的方式是在定义静态变量的同时给出初始值。这种方式适用于值确定、无需复杂逻辑的场景。
- 基本类型和字符串常量可直接写死: public static int PORT = 8080;
- 引用类型可调用构造器或工厂方法: public static List
DEFAULT_LIST = Arrays.asList("a", "b"); - 注意:final static 基本类型或字符串字面量(如 public static final String NAME = "test";)会在编译期内联,不参与运行时类初始化
静态代码块中赋值
当初始化逻辑较复杂(比如读配置文件、连接数据库、计算依赖其他静态变量的值),推荐使用静态代码块。它在类加载时按源码顺序执行,且只运行一次。
- 多个静态代码块会按出现顺序依次执行
- 可以对多个静态变量统一初始化,避免重复逻辑
- 能捕获异常并做处理,而声明时直接赋值无法写 try-catch
- 示例:static { try { config = loadFromProperties(); } catch (IOException e) { throw new ExceptionInInitializerError(e); } }
通过静态方法返回值初始化
把初始化逻辑封装成静态方法,在声明处调用。这种方式提升了可读性和可测试性,尤其适合需要复用或后期替换实现的场景。
- 方法必须是 static,且不能依赖尚未初始化的其他静态字段(否则可能为默认值)
- 支持延迟计算,但仍是类加载时触发
- 示例:public static final Logger LOGGER = createLogger(); private static Logger createLogger() { return LogManager.getLogger(MyClass.class); }
初始化顺序与注意事项
静态变量和静态代码块的执行严格按源码从上到下顺序进行,父类先于子类。JVM 将它们合并进一个名为
- 声明时先设默认值(如 int=0,Object=null),再按顺序执行显式赋值
- 前面的静态变量可在后面的静态代码块中被读取,但不能在它自己声明前被读取(会得到默认值)
- 避免跨类静态依赖循环——A 类初始化依赖 B 类的静态字段,B 类又依赖 A 类,将导致 NoClassDefFoundError 或初始化失败
- 数组必须显式 new,否则是 null:private static String[] cache = new String[100]; 而非 private static String[] cache;
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











