finalize() 是 Object 类的受保护方法,子类重写时仅执行自身实现;Object 的默认 finalize() 为空操作,不会自动调用,也无需显式调用 super.finalize()。该方法自 Java 9 起已弃用,不应用于资源清理。
`finalize()` 是 `object` 类的受保护方法,子类重写时仅执行自身实现;`object` 的默认 `finalize()` 为空操作,不会自动调用,也无需显式调用 `super.finalize()`。该方法自 java 9 起已弃用,不应用于资源清理。
在 Java 中,finalize() 方法遵循标准的方法重写(Override)语义:当子类提供同名、同签名的 finalize() 实现时,JVM 在对象即将被垃圾回收时,只会调用该对象实际运行时类型(即最具体子类)所定义的 finalize() 方法,而不会自动调用父类版本。
以您提供的代码为例:
public class Person {
int age;
String name;
@Override
public void finalize() throws Throwable {
System.out.println("Garbage collected --->" + this);
}
}
此处 Person.finalize() 完全覆盖了 Object.finalize()。当 p = null 后触发 System.gc(),JVM 检测到 Person 实例可被回收,便直接调用 Person.finalize() —— Object.finalize() 并未被执行,因为它本就为空(源码中仅为 {}),且 JVM 不会隐式插入 super.finalize() 调用。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
⚠️ 常见误解澄清:
- ❌ “父类 finalize() 会被自动调用” → 错误。Java 方法重写不具有自动链式调用特性(不同于构造器中的 super())。
- ❌ “必须手动写 super.finalize() 才算完整” → 不必要。Object.finalize() 是空方法,调用它无任何副作用,也无实际意义。
- ✅ 正确做法:若子类 finalize() 中需确保父类逻辑执行(例如父类有非空实现),才应显式添加 super.finalize() —— 但 Object 类不在此列。
此外,需重点强调:
? finalize() 自 Java 9 起已被标记为 @Deprecated,Java 18 进一步将其设为 forRemoval = true;
? 它不可靠、性能差、行为不确定(如不保证何时/是否执行),绝不可用于释放关键资源(如文件句柄、数据库连接);
? 推荐替代方案:
✓ 使用 try-with-resources 管理实现了 AutoCloseable 的资源;
✓ 使用 Cleaner(Java 9+)或 PhantomReference 构建更可控的清理机制;
✓ 依赖显式关闭逻辑(如 close() 方法),由开发者主动调用。
综上:您观察到的 finalize() 被调用,纯粹是子类重写生效的结果;Object.finalize() 从未参与执行。请将 finalize() 视为历史遗留机制,现代 Java 开发中应完全规避。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










