Java 中代码块执行顺序如何影响对象的生命周期
Java对象创建需依次执行静态代码块(类加载时一次)、构造代码块(每次new前自动执行)和构造方法体,顺序严格遵循父类优先于子类。任何环节异常中断都会导致对象无法进入可达状态,new表达式返回引用不代表对象已就绪。
一个 Ja va 对象能否被成功创建,并不是简单地看 new 表达式有没有返回引用。说到底,得等到静态代码块、构造代码块和构造方法体全部执行完毕,这个对象才算真正“活”过来。静态块在类加载时跑一次,构造块每次 new 之前都会自动执行,而局部块只控制变量作用域——这三块代码的执行顺序,直接决定了对象从无到有的每一步是否完整可靠。这不是什么细枝末节,而是对象能否真正被创建出来的关键路径。

静态代码块:类加载时的唯一入口
当类第一次被主动使用(比如 new 对象、调用静态方法),JVM 就会触发类初始化。这时候,所有静态代码块会按照书写顺序执行一次。注意,它不依赖任何对象,只和类本身绑定。如果静态块里抛出了异常,整个类初始化直接失败——后续任何对象都无法创建,连门都进不去。
- 只执行一次,哪怕创建一百个对象也不会再跑
- 适合初始化共享资源,比如数据库连接池、配置单例
- 不能访问非静态成员,否则编译报错
构造代码块:每个对象诞生前的统一准备
每次 new 对象时,在调用构造方法体之前,构造代码块(也就是实例代码块)都会自动执行。它放在类中、方法外,没有 static 修饰。作用很简单:把多个构造器共用的初始化逻辑抽出来,避免到处重复。
- 父类构造代码块先于子类执行,顺序严格按继承链
- 字段初始化语句(比如
int x = 10;)和构造代码块在底层都被编译进方法,执行顺序由源码中间出现的位置决定 - 如果构造代码块中抛异常,对象分配的内存不会被使用,也不会进入可达状态
局部代码块:不影响对象生命周期,但影响变量存活时间
写在方法内部的 { } 块,只控制变量作用域和栈空间释放时机,和对象创建过程完全无关。它在方法调用时执行,每次调用都重新运行,变量一出块就失效。
- 不能加任何修饰符(
public、static等都不行) - 嵌套块内可以声明同名变量,但彼此隔离,互不影响
- 常用于循环体内,防止变量跨迭代残留或误用
执行顺序决定对象是否“真正可用”
一个对象只有在类初始化完成(静态块跑完)、实例初始化完成(构造代码块 + 构造方法体全部执行完毕)后,才被视为创建成功。中间任何一个环节中断(比如静态块抛异常、构造块中 throw RuntimeException),对象就不会进入“可达”状态,GC 也不会介入回收——因为它根本没活过来。
- 典型顺序:静态代码块 → 构造代码块 → 构造方法体
- 父类部分总在子类之前完成
new表达式返回引用,不等于对象已就绪;必须等执行完才算“活”了


































