我读(在某处),当子类被垃圾收集时,不保证调用父类的finalize()
,这是否意味着大多数开发人员在子类中重写finalize()
并调用{{ 1}}?
答案 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();
}
}
如果想要清理资源,那么或许可以查看幻像引用 - 如果一个对象在强烈/弱/软可达,并且已经完成并且已经完成,则该对象是幻象可达的。至少有一个幻影参考(即对象已经完成但尚未回收)。