Java继承体系下初始化顺序本质是静态初始化与实例初始化的叠加:静态部分父类优先、仅执行一次,按静态变量赋值→静态块顺序;实例部分每次new都执行,顺序为父类实例变量/块→父类构造器→子类实例变量/块→子类构造器。

Java 继承体系下代码块与构造方法的执行顺序,本质是两类初始化过程的叠加:类加载时的静态初始化 + 对象创建时的实例初始化。两者严格分离、不可交叉,但共同构成完整的对象诞生流程。
静态部分:只执行一次,按类加载顺序触发
静态代码块和静态变量属于类级别,在类首次被主动使用(如 new、调用静态方法、访问静态字段)时执行,且全局仅一次。顺序固定为:
- 父类静态变量初始化(按源码声明顺序)
- 父类静态代码块(紧随其后,多个则按书写顺序)
- 子类静态变量初始化
- 子类静态代码块
后续无论 new 多少次对象,这部分都不会重复;若先 new 父类再 new 子类,父类静态块已在首次加载时完成,子类静态块在其首次加载时补上。
实例部分:每次 new 都完整走一遍,自顶向下逐层展开
每次创建对象时,JVM 从 Object 开始,逐级向下完成实例初始化。编译器会把实例变量赋值和非静态代码块“插入”到每个构造方法开头(super()之后),因此它们总在构造方法体之前运行:
立即学习“Java免费学习笔记(深入)”;
- 父类实例变量初始化(如 String name = "Tom";)
- 父类非静态代码块({ ... })
- 父类构造方法体(含隐式或显式的 super())
- 子类实例变量初始化
- 子类非静态代码块
- 子类构造方法体
这个链条确保父类状态先就绪,子类才能安全访问——比如子类构造方法中调用被重写的方法时,父类字段已不是默认值(null/0)。
别混淆两类“块”的作用层级
静态代码块解决“类准备好没”,实例代码块解决“这个对象怎么初始化”:
- 静态代码块里不能访问实例成员(无 this 上下文),但可安全使用 public static 字段
- 实例代码块可访问 this、实例变量、静态成员,常用于抽取多个构造器共有的初始化逻辑
- 普通方法内的 { ... } 是局部作用域,不参与初始化流程,按自然顺序执行即可
验证建议:用打印语句动手跑一跑
写一个父子类,在静态块、实例块、构造方法中分别输出明确标识(如“父类静态块”“子类实例块”),然后在 main 中连续 new 两次子类对象。你会清晰看到:
- 第一次 new:静态块各执行一次,实例块和构造方法各执行两次
- 第二次 new:静态块不再出现,实例块和构造方法照常执行
这种直观反馈比死记顺序更可靠,也更容易理解 JVM 的实际行为。


















