Java类初始化严格按JVM规范分两阶段执行:类加载时先执行父类静态变量与静态块(按源码顺序),再子类静态部分;对象创建时先父类实例变量与块、构造器,再子类对应部分。

Java类初始化不是“一上来就执行构造函数”,而是有一套严格分层、按序触发的机制。理解它,关键在于区分“类加载时”和“对象创建时”两个阶段,以及静态与实例、父类与子类的层级关系。
静态内容:类加载时只跑一次
当JVM首次主动使用一个类(比如new对象、调用static方法、访问static字段等),就会触发该类的初始化——此时只执行静态部分,且仅一次。
- 按源码书写顺序,逐个执行静态变量显式赋值(如 static int a = 1;)
- 遇到静态代码块(static { ... })就立即执行,同样按出现顺序
- 注意:静态变量的默认值(如int为0)是在“准备阶段”由JVM自动设的,不属于初始化阶段;真正赋值动作才属于初始化
- 如果静态变量初始化过程中 new 了本类对象,会中断当前静态流程,转去执行该对象的实例初始化(含非静态块、构造器等),但静态部分仍只执行一次
实例内容:每次 new 都走一遍
创建对象时,实例相关逻辑在构造函数执行前完成,确保对象状态已初步就绪。
- 先为所有实例变量分配内存,并设默认值(int→0,Object→null)
- 再按代码顺序执行:非静态代码块({ ... })、实例变量显式赋值(如 String name = "abc";)
- 最后才进入构造函数体;即使没写构造函数,编译器生成的默认构造器也会隐式调用 super()
- 非静态代码块适合放多个构造器共用的初始化逻辑,比重复写几遍更清晰
继承体系:父→子,静态→实例,层层递进
有继承时,初始化不是“平铺直叙”,而是严格遵循“先父后子、先静后实”的双维度嵌套。
立即学习“Java免费学习笔记(深入)”;
- 第一步:父类静态变量 + 父类静态代码块(按顺序)
- 第二步:子类静态变量 + 子类静态代码块(按顺序)
- 第三步:父类实例变量默认值 → 父类非静态代码块/显式赋值 → 父类构造函数
- 第四步:子类实例变量默认值 → 子类非静态代码块/显式赋值 → 子类构造函数
- 哪怕子类没写任何静态成员,只要被初始化,父类静态部分也一定先执行
触发时机:六种情况才会真正开始初始化
类不会在定义时就初始化,只有被“主动使用”才会启动整个流程。
- 用 new 创建该类实例
- 访问该类的静态字段(final 基本类型或字符串字面量除外,它们在编译期就内联了)
- 调用该类的静态方法
- 通过反射(如 Class.forName("Xxx"))加载类
- 初始化子类时,JVM强制先初始化其直接父类(哪怕父类没被显式用过)
- 运行包含 main() 方法的类(即程序入口类)


















