finalize() 何时调用?现在还应该使用吗?
先说出你的答案
定义边界、关键机制、一个反例;P8题再补容量、失败与验证。
查看完整题解
参考回答
直接回答
finalize() 是旧式对象终结机制的回调,不能保证何时执行,也不能保证程序退出前一定执行。Java 21 已把它标记为“弃用并计划移除”,不应再用于释放文件、连接或锁。它也不是 C++ 那种随对象销毁确定执行的析构函数。
讲清原理
过去,虚拟机发现某个对象符合终结条件时,可能安排执行它的 finalize()。这不代表“对象一出作用域就执行”,也不代表“执行后马上释放内存”。终结过程可能拖延,对象甚至可能通过重新建立引用而复活。
对象内存由垃圾收集器管理;文件句柄等外部资源需要明确关闭。两件事不能绑在一起。现在优先用 AutoCloseable 和 try-with-resources,让资源在离开代码块时关闭。Cleaner 只能作为某些资源的补救机制,同样不能替代及时关闭。
例子与易错点
try (var reader = java.nio.file.Files.newBufferedReader(path)) {
System.out.println(reader.readLine());
} // 正常返回或抛异常时,都会尝试 close()
这里 path 是已有的 Path。示例演示资源管理,不依赖 GC。调用 System.gc() 也不能保证某个对象的 finalize() 已执行;不要用等待终结来保证业务正确性。
相关题:第 7 题、第 29 题。
和评分标准对照,你能独立回答到哪一步?
自评会安排下一次复习,不保存你的口述内容。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。