java对象初始化顺序为“类加载→静态块→构造块→构造方法”:先父类静态块、子类静态块,再父类构造块与构造方法、子类构造块与构造方法;构造块与实例字段初始化合并入构造方法开头,紧随super()之后。

掌握静态块、构造块和构造方法的执行顺序,关键不是死记硬背,而是理解 JVM 在类加载和对象创建两个阶段的行为逻辑。只要分清“类还没用”和“开始 new 对象”这两个时间点,顺序自然就清晰了。
类加载阶段:静态块只跑一次,父类先于子类
当 JVM 第一次主动使用某个类(比如调用它的静态方法、访问它的静态字段,或 new 它的实例),就会触发该类及其父类的加载与初始化。这个阶段只涉及静态内容:
- 先执行父类的静态变量赋值和静态代码块(按声明顺序)
- 再执行子类的静态变量赋值和静态代码块(同样按声明顺序)
- 整个过程与对象无关,哪怕你没 new 一个实例,只要类被引用,静态块就执行且仅执行一次
对象创建阶段:从父类构造块到子类构造方法
一旦执行 new Child(),JVM 就进入实例初始化流程。此时不再看“类有没有加载过”,而是专注为这个新对象分配内存并填充初始状态:
- 先隐式或显式调用 super(),进入父类构造流程
- 在父类构造方法体执行前,依次执行父类的非静态字段赋值和构造代码块(即 {} 块)
- 然后运行父类构造方法体
- 回到子类,同样顺序执行子类的非静态字段赋值、构造代码块、构造方法体
构造块和字段初始化本质是一回事
Java 编译器会把类中所有构造代码块({})和非静态字段的初始化语句,按出现顺序合并进每个构造方法的开头——紧接在 super() 调用之后。这意味着:
- 写在类顶部的 int x = 10; 和写在它下面的 { y = 20; },执行顺序就是 x 先于 y
- 多个构造方法都共享同一套构造块逻辑,无需重复编写
- 构造块能访问实例变量和静态成员,但不能直接调用非静态方法(除非已有 this 引用)
常见误区提醒
容易混淆的地方往往出在“谁先触发类加载”和“谁属于实例范畴”:
- main 方法所在类是主类,它的静态块在程序启动时就执行;其他类的静态块,要等到第一次被主动使用才触发
- 构造代码块不是“构造函数的一部分”,而是独立的初始化器;它每次 new 都执行,不因构造方法重载而跳过
- 局部代码块(方法内 {})完全不在这个链里,它只随方法调用而执行,和类/对象生命周期无关










