出于好奇,
为什么是finalize()
方法的访问修饰符被设为protected
。为什么不能是public
?有人可以向我解释一下这背后的具体原因吗?
另外,我也了解到finalize()
方法仅被调用一次。如果我在程序内部调用它两次,会发生什么?垃圾收集器会再次调用这个吗?
private void dummyCall() {
try {
finalize();
finalize();
} catch (Throwable e) {
e.printStackTrace();//NOT REACHES EXCEPTION
}
}
我用另一个问题来回答你的问题:
Why finalize
方法不应该受到保护吗?
一般来说,您应该尽量保持私密性。这就是封装的意义所在。否则,你可以使一切 public
. finalize
不可能private
(因为派生类应该能够访问它以便能够覆盖它),所以它至少应该是protected
但为什么在不需要的时候要给予更多的访问权限呢?
仔细阅读您的评论后,我想我现在明白您的要点了。我认为你的观点是因为一切都源于java.lang.Object
并因此访问其protected
成员,它不会有任何区别(或任何方法java.lang.Object
就此而言)是public
相对于protected
。就我个人而言,我认为这是 Java 的一个设计缺陷。这在 C# 中确实是固定的。问题不在于为什么finalize
受到保护。没关系。真正的问题是您不应该能够通过基类类型的对象引用调用基类中受保护的方法。埃里克·利珀特有一个博客条目 http://blogs.msdn.com/ericlippert/archive/2010/01/14/why-cant-i-access-a-protected-member-from-a-derived-class-part-six.aspx讨论为什么允许受保护成员进行这种访问是一个坏主意在这个问题中进一步详细阐述了 Stack Overflow https://stackoverflow.com/questions/1904782/whats-the-real-reason-for-preventing-protected-member-access-through-a-base-sibl.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)