静态变量在类加载的初始化阶段执行一次显式赋值,成员变量在每次new对象时、构造方法执行前初始化。

Java 中成员变量和静态变量的初始化时机、方式和阶段完全不同,不能混为一谈。静态变量属于类级别,在类加载的“初始化”阶段按源码顺序执行显式赋值;而成员变量(非静态)属于实例级别,在每次 new 对象时才参与初始化,且发生在构造方法体执行之前。
静态变量:只在类初始化阶段执行一次
静态变量的初始化分两个子阶段:
-
准备阶段:JVM 为所有 static 变量分配内存,并设默认值(如
int→0,Object→null),此时不执行任何赋值语句 -
初始化阶段:当类被首次主动使用(如
new、调用静态方法、访问非 final 静态字段等)时,JVM 执行<clinit>方法——它由编译器把所有静态变量显式初始化语句和static{}块按源码从上到下合并而成 - 父类静态部分一定先于子类执行,且整个过程只发生一次;若中途抛出未捕获异常,该类后续所有使用都会报
NoClassDefFoundError
成员变量:每次 new 对象时都重新初始化
成员变量不参与类加载过程,而是在对象创建流程中初始化:
- JVM 在调用构造方法前,会把所有成员变量的声明赋值(如
String s = "abc";)和实例代码块({ ... })按源码顺序插入到构造方法开头 - 执行顺序固定为:父类成员变量/实例块 → 父类构造方法 → 子类成员变量/实例块 → 子类构造方法
- 即使成员变量声明在构造方法之后,其初始化动作仍被提前到构造方法最开始处执行
关键区别一句话总结
静态变量是“类的事”,靠类加载触发,只做一次;成员变量是“对象的事”,靠 new 触发,每次新建都重来。两者不在同一生命周期里,也不共享初始化逻辑。
立即学习“Java免费学习笔记(深入)”;


















