为什么 java.lang.Object 中的 finalize() 方法受到“保护”?

2022-09-01 05:49:48

出于好奇,

为什么该方法的访问修饰符显示为 .为什么不能呢?有人能解释一下这背后的具体原因吗?finalize()protectedpublic

另外,我开始知道该方法只被调用一次。如果我在程序内部调用它两次,会发生什么情况?垃圾回收器会再次调用它吗?finalize()

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

答案 1

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

为什么方法不应该受到保护?finalize

一般来说,你应该尽量保持隐私。这就是封装的全部意义所在。否则,您可以制作所有内容。 不能(因为派生类应该能够访问它以便能够重写它),所以它至少应该是,但是当它不受欢迎时,为什么要提供更多的访问权限呢?publicfinalizeprivateprotected


在更仔细地阅读了您的评论之后,我想我现在看到了您的主要观点。我认为你的观点是,由于所有内容都源于并因此访问其成员,因此它与(或该事项中的任何方法)相比没有任何区别。就个人而言,我认为这是Java中的一个设计缺陷。这在C#中确实是固定的。问题不在于为什么受到保护。没关系。真正的问题是,您不应该能够通过基类类型的对象引用来调用基类中的受保护方法。Eric Lippert有一篇博客文章,讨论了为什么允许对受保护成员进行这种访问是一个坏主意,这个问题中的Stack Overflow对此进行了进一步阐述java.lang.Objectprotectedjava.lang.Objectpublicprotectedfinalize


答案 2

为什么 finalize() 方法的访问修饰符被指定为受保护。为什么不能公开?

它不是公开的,因为它不应该被JVM以外的任何人调用。但是,它必须受到保护,以便它可以被需要为其定义行为的子类覆盖。

如果我在我的程序中调用它两次,内部发生了什么?

你可以随心所欲地调用它,它毕竟只是一个方法。但是,与 非常相似,它对JVM具有特殊意义public static void main(String [] args)

垃圾回收器会再次调用它吗?

是的


推荐