java对象构建始于类加载而非new,分“类初始化”(仅一次)和“对象初始化”(每次new执行)两层:先按顺序执行父、子类静态变量与静态代码块;再为实例变量设默认值,依次执行父类实例变量/代码块/构造器、子类实例变量/代码块/构造器。

Java对象构建不是从new开始的,而是从类加载起步、分阶段推进的过程。理解它,关键在于区分“类初始化”和“对象初始化”两个层次——前者只发生一次,后者每次new都执行。
类加载阶段:静态成员优先登场
当JVM第一次遇到某个类(比如通过new Child()、调用其静态方法或访问静态字段),就会触发类加载。这个阶段只做一件事:为类准备静态资源。
- 按源码书写顺序,依次执行父类的静态变量赋值、静态代码块
- 再按书写顺序,执行子类的静态变量赋值、静态代码块
- 所有静态内容全局仅执行一次,后续创建再多对象也不会重复
对象实例化阶段:从默认值到构造完成
类已加载完毕,真正创建对象时,JVM在堆中分配内存后,会严格按以下顺序完成初始化:
- 给所有实例变量设默认值(如
int→0,Object→null) - 按书写顺序,执行父类的实例变量显式赋值、实例代码块(即
{...}) - 执行父类构造器(即使没写
super(),编译器也会自动插入) - 再按书写顺序,执行子类的实例变量显式赋值、实例代码块
- 最后执行子类构造器
继承场景下的完整链条(口诀版)
以new Child()为例,实际执行流是线性的、不可跳过的:
- 父类静态变量 → 父类静态代码块
- 子类静态变量 → 子类静态代码块
- 父类实例变量 → 父类实例代码块 → 父类构造器
- 子类实例变量 → 子类实例代码块 → 子类构造器
注意:父类构造器一定在子类任何实例初始化动作之前完成;子类构造器里的super(...)只是显式调用,不改变上述底层顺序。
常见误区提醒
这些点容易引发逻辑错误或面试失分:
- 静态代码块里不能直接访问非静态成员(编译报错)
- 实例代码块可访问静态和非静态成员,但它在构造器之前执行,不是“构造器的一部分”
- 如果静态变量初始化时抛出异常,会触发
ExceptionInInitializerError,导致类加载失败,之后所有对该类的使用都会失败 - 类中有
static final常量时,若为编译期常量(如static final int X = 1;),它可能被内联优化,不参与类加载流程
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











