Java变量初始化顺序为类变量→实例变量→构造器:类变量在类加载时按声明顺序初始化,实例变量在对象创建时按源码顺序初始化并赋默认值,构造器最后执行且需避免调用可重写方法。

Java 中变量的初始化顺序严格遵循“类变量 → 实例变量 → 构造器”的执行逻辑,这个顺序直接影响程序行为,尤其在存在依赖或副作用时容易出错。
类变量(静态变量)最先初始化
类变量在类加载的初始化阶段执行,按声明顺序从上到下完成赋值。静态代码块也在此阶段运行,且与静态变量交错执行——遇到一个静态变量就初始化,遇到一个静态代码块就执行。
- 只执行一次,与对象创建无关
- 即使从未实例化该类,只要类被主动使用(如调用静态方法、访问静态字段),就会触发初始化
- 若静态变量依赖尚未声明的另一个静态变量,其值为对应类型的默认值(如 int 为 0,Object 为 null)
实例变量在每次创建对象时初始化
在 new 表达式执行后、构造器体执行前,JVM 会按源码中出现的顺序,依次为实例变量赋默认值(如 0、false、null),再执行显式初始化和实例初始化块。
- 每个对象独立拥有自己的实例变量副本
- 实例初始化块(非静态代码块)与实例变量初始化穿插进行,顺序取决于它们在类中定义的位置
- 若实例变量初始化表达式中调用了方法,该方法内访问的实例变量可能尚未初始化(仍为默认值)
构造器最后执行
构造器是整个初始化流程的收尾环节。此时类变量和实例变量均已就位,但要注意:如果构造器中调用了被子类重写的方法,而该方法又访问了子类的实例变量,则可能读到未初始化的默认值(因子类实例变量初始化尚未开始)。
立即学习“Java免费学习笔记(深入)”;
- 父类构造器总在子类构造器之前执行
- 构造器中应避免调用可被重写的方法,以防初始化不完整导致逻辑错误
- this() 或 super() 调用必须是构造器的第一条语句,它不改变变量初始化时机,只决定构造器链的起点
理解这个顺序,能帮你避开空指针、默认值误用、静态依赖循环等常见陷阱。实际编码中建议减少初始化过程中的复杂逻辑和跨变量依赖,让意图更清晰。






