出于好奇
为什么finalize()
方法的访问修饰符被设为protected
。为什么不能公开
?有人可以向我解释一下这背后的具体原因吗?
此外,我发现 finalize()
方法仅被调用一次。如果我在程序内部调用它两次,会发生什么?垃圾收集器会再次调用这个吗?
private void dummyCall() {
try {
finalize();
finalize();
} catch (Throwable e) {
e.printStackTrace();//NOT REACHES EXCEPTION
}
}
最佳答案
我用另一个问题来回答你的问题:
Why
finalize
method shouldn't be protected?
一般来说,您应该尽量保持私密性。这就是封装的意义所在。否则,你可以做一切 public
。 finalize
不可能private
(因为派生类应该能够访问它以便能够覆盖它),所以它至少应该是 protected
但为什么要在不需要时提供更多访问权限呢?
仔细阅读您的评论后,我想我现在明白您的要点了。我认为你的观点是因为一切都源于 java.lang.Object
并因此访问其 protected
成员,它(或 java.lang.Object
中的任何方法)是 public
没有任何区别。与 protected
相反。就我个人而言,我认为这是 Java 的一个设计缺陷。这在 C# 中确实是固定的。问题不是为什么finalize
受到保护。没关系。真正的问题是您不应该能够通过基类类型的对象引用调用基类中 protected 方法。埃里克·利珀特 (Eric Lippert) 有一个 blog entry讨论为什么允许 protected 成员进行此类访问是一个坏主意,即 further elaborated on Stack Overflow in this question .
关于java - 为什么 java.lang.Object 中的 Finalize() 方法是 "protected"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23967373/