【发布时间】:2011-01-18 11:41:45
【问题描述】:
出于好奇,
为什么finalize() 方法的访问修饰符被设为protected。为什么不能是public?有人可以解释一下这背后的任何具体原因吗?
另外,我知道finalize() 方法只被调用一次。如果我在内部程序中调用它两次,会发生什么?垃圾收集器会再次调用这个吗?
private void dummyCall() {
try {
finalize();
finalize();
} catch (Throwable e) {
e.printStackTrace();//NOT REACHES EXCEPTION
}
}
【问题讨论】:
-
为什么要编写一个方法来调用 finalize()。 finalize() 在 JVM 销毁实例时调用。你不应该调用它。不过,您可以覆盖它,以防您在销毁时需要特殊行为...
-
是的。我个人永远不会那样做。但是我出于好奇而问它,因为我读过 GC 如果它已经在一个对象上调用它就不会调用它。谁在跟踪这个 finalize() 方法是否被调用是我的疑问。不过,对于第二个问题,我还没有令人信服的解释。
-
真正有趣的问题是:为什么 finalize() 出现在 Java OO 层次结构的最顶层?这里有 200K LOC 项目,我们没有一次覆盖 finalize()。有些人甚至会说重写 finalize() 是一种代码味道,一些异端甚至会说 finalize() 在 OOA/OOD 级别不存在并且它存在于 Java 层次结构的顶部是一个(破碎的)Java 特质(并且与您的问题空间完全无关)。顺便说一句,这里有很多赞成的答案认为 finalize() 以某种方式被破坏/存在缺陷:)
-
只有 Java 专家才能接近 finalize()。
-
'真正有趣的问题是:为什么 finalize() 出现在 Java OO 层次结构的最顶层? Err,所以 GC 可以在任何对象上调用它?