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

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

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

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

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

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

最好避免依赖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(); } } 

如果想要清理资源,那么查看幻像引用是明智的 – 如果一个对象在强度/弱/弱可达,最终确定并且至少存在一个幻像引用(即对象)时,则该对象是幻象可达的已经完成但尚未收回)。