java - 为什么 java.lang.Object 中的 Finalize() 方法是 "protected"?

标签 java finalize

出于好奇

为什么finalize()方法的访问修饰符被设为protected。为什么不能公开?有人可以向我解释一下这背后的具体原因吗?

此外,我发现 finalize() 方法仅被调用一次。如果我在程序内部调用它两次,会发生什么?垃圾收集器会再次调用这个吗?

private void dummyCall() {
    try {
        finalize();
        finalize();
    } catch (Throwable e) {
        e.printStackTrace();//NOT REACHES EXCEPTION
    }
}

最佳答案

我用另一个问题来回答你的问题:

Why finalize method shouldn't be protected?

一般来说,您应该尽量保持私密性。这就是封装的意义所在。否则,你可以做一切 publicfinalize不可能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/

相关文章:

java.lang.IllegalStateException : You need to use a Theme. AppCompat 主题(或后代)与此 Activity

java - 使用允许安装目录选择的 Netbeans 创建 .exe

java - SQLGrammarException : No value specified for parameter 1 hibernate

java - Jenkins启动错误: jenkins. model.InvalidBuildsDir : does not contain ${ITEM_FULL_NAME} or ${ITEM_ROOTDIR},无法区分项目

java - 以编程方式重构参数名称

java - Bug JDK-8191002 不清楚是编程错误还是 JRE 错误

java - java中如何销毁一个对象?

c# - 在 yield return 函数中是否可以确保在同一个线程上调用终结器?

Java:需要对引用对象的 API 文档进行说明

java - 在这种情况下,什么时候会对我的类实例调用 Finalize() ?