7

我读到(某处),finalize()当子类被垃圾收集时,不能保证调用父类,这是否意味着大多数开发人员finalize()在子类中重写并调用super.finalize()

4

2 回答 2

14

不会为超类自动调用 Finalize。因此,如果您覆盖 finalize,确保清理超类的正确方法是

protected void finalize() {
    try {
       // do subclass cleanup
    }
    finally {
       super.finalize();
    }
}

请参阅此参考文章http://www.ibm.com/developerworks/java/library/j-jtp06294/index.html

值得注意的是,终结器不是非常可预测的,您无法控制它们是否/何时运行。在 finalize 方法中不应该做任何关键的事情。一般来说,最好只对你的类进行显式清理。

于 2012-07-07T22:31:28.750 回答
3

最好避免依赖 finalize 来清理任何非 Java 资源(不保证 finalize 调用)。如果可能,请使用 try with resources(如果使用 JDK7)或 try finally 子句在可能的其他选项中清理资源。如果要使用 finalize,可以将 super.finalize 放在 try finally 块中。明智的做法是不要依赖 finalize 来清理资源。

// don't make it public!  
protected void finalize() throws Throwable
{  
   try  
   {  
     // custom finalization here  
   }  
   finally  
   {  
     super.finalize();  
   }  
} 

如果这个想法是清理资源,那么检查幻影引用是明智的——如果一个对象既不是强/弱/软可访问的,又是最终确定的,并且至少有一个幻像引用(即对象已完成但尚未回收)。

于 2012-07-07T22:33:23.093 回答