静态变量在类加载时分配内存并初始化,生命周期与类一致,存于方法区(jdk 8+为元空间),所有对象共享且仅一份;其分配与赋值分准备(设默认值)和初始化(执行显式赋值及静态块)两阶段完成。

静态变量在类加载时就完成内存分配,不是靠 new 对象触发的,也不随对象增减而变化。它的生命周期绑定类本身,从类被 JVM 加载开始,到程序结束才释放。
静态变量属于类,不是对象
普通成员变量存在堆内存中,每个 new 出来的对象都有一份独立副本;而 static 变量只有一份,所有对象共享。比如定义 public static int count = 0;,无论创建 1 个还是 100 个对象,count 在内存里始终只有一个地址、一个值。
内存分配发生在方法区(JDK 8+ 是元空间)
静态变量不进堆,也不进栈,而是存放在方法区(或 JDK 8 后的元空间)。这个区域由所有线程共享,专门存放类结构信息、常量、静态成员等。只要类被加载,它就存在;类卸载时才回收(通常整个应用运行期间都不会卸载)。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
分配和初始化分两个阶段完成
类加载过程包含准备(Preparation)和初始化(Initialization)两个关键步骤:
- 准备阶段:为 static 变量分配内存,并设默认值(如 int → 0,Object → null);此时 int x = 5; 中的 5 还没赋上
- 初始化阶段:执行 static 变量的显式赋值(如 = 5)和静态代码块里的逻辑;这才是真正“设初值”的时刻
触发类加载的常见方式
以下任一操作都会导致类加载,进而触发静态变量的分配与初始化:
- 访问该类的静态变量或静态方法(例如 MyClass.value 或 MyClass.doWork())
- 使用 new 创建该类的第一个实例
- 反射调用(如 Class.forName("MyClass"))
- 子类初始化时,若父类尚未加载,也会先加载父类
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










