我有一个物体。它打开了FileConnection
。
现在,我引用了对象null
。
然后GC
[ G arbage- C ollecter]运行。
因此,GC
将释放对象并关闭由对象持有的FileConnection
。
那为什么我需要重写finalize方法?
答案 0 :(得分:2)
finalize()
恰好在销毁对象之前被GC调用。根本不可能发生,并且永远不会调用finalize()
方法。
如果您占用资源(即打开文件),则必须正确地手动释放它。您可以使用AutoCloseable
界面。
示例:
try (Scanner scan = new Scanner(new File("xxx"))) {
// do smth.
} // scan.close() will be automatically called here
或更严格地说:
Scanner scan = null;
try {
scan = new Scanner(new File("xxx"));
} finally {
if (scan != null)
scan.close(); // instead of scan.finalize();
}
PS 。切勿使用finalize()
方法-这种方法已经过时,并用于非常具体的低级解决方案中。如果您问这个问题,则意味着这不是您的问题。
答案 1 :(得分:0)
您不需要覆盖finalize
方法。最好不要忘记finalize
方法,因为它已被弃用。
但是您确实需要在处理完资源后立即将其关闭。 GC可能会将未使用的对象保留很长时间。如果依靠GC关闭系统资源,则操作系统级别的文件句柄,锁或套接字可能用完了。 这些资源有限。