Java中代码块不参与对象销毁,仅在类加载和对象创建时执行;对象销毁由GC决定,不可预测,需用AutoCloseable、Cleaner等显式清理资源。

Java 中代码块本身不参与对象销毁过程,也没有“在对象销毁前执行”的内置机制。所谓“代码块的执行顺序”,仅适用于类加载和对象创建阶段;而对象销毁是 JVM 垃圾回收(GC)行为,不可预测、不由代码块控制。
真正与销毁相关的,只有 finalize() 方法(已废弃)或 Cleaner/PhantomReference 等显式资源清理机制,它们不属于代码块范畴,也不受静态块、构造块等执行顺序规则约束。
所以,回答核心很明确:
- 静态代码块、构造代码块、普通代码块,全部只在初始化阶段运行;
- 它们不会在对象销毁前自动执行,也不会被 JVM 插入到销毁流程中;
- 对象何时销毁由 GC 决定,开发者无法精确控制,更无法依赖代码块做“销毁前处理”。
重点提醒:finalize() 方法虽曾设计为“对象销毁前回调”,但它:
立即学习“Java免费学习笔记(深入)”;
- 自 Java 9 起标记为
@Deprecated; - 自 Java 14 起默认禁用(可通过
-XX:+EnableFinalization开启,但不推荐); - 不保证执行时机,甚至可能永不执行;
-
不能替代
try-with-resources或AutoCloseable的显式关闭逻辑。
如果你需要在对象不再使用时释放资源(如文件句柄、网络连接),正确做法是:
- 实现
AutoCloseable接口,配合try-with-resources语句; - 使用
Cleaner注册清理动作(JDK 9+ 推荐); - 在业务逻辑中主动调用
close()或shutdown()方法。
构造代码块和静态代码块,只管“怎么建”,不管“怎么毁”。
对象销毁不是初始化的逆过程,没有对称的代码块执行顺序。


















