你在子类中调用super.finalize()吗?

时间:2012-07-07 22:21:55

标签: java inheritance garbage-collection

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

2 个答案:

答案 0 :(得分:13)

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

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

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

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

答案 1 :(得分:3)

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

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

如果想要清理资源,那么或许可以查看幻像引用 - 如果一个对象在强烈/弱/软可达,并且已经完成并且已经完成,则该对象是幻象可达的。至少有一个幻影参考(即对象已经完成但尚未回收)。