当前位置: 首页 > 面试题库 >

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

公良修竹
2023-03-14
问题内容

出于好奇,

为什么将finalize()方法的访问修饰符设置为protected。为什么不能呢public?有人可以向我解释这背后的任何具体原因吗?

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

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

问题答案:

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

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

通常,您应该尝试使事物尽可能私密。这就是封装的全部意义所在。否则,您 什么都
可以做publicfinalize不能private(因为派生类应该能够访问它以覆盖它),所以它至少应该是,protected但是为什么在不希望使用时给予更多访问权限呢?

在更仔细地阅读了您的评论之后,我想我现在明白了您的要点。我觉得你的意思是,因为从一切导出java.lang.Object,因此访问其protected成员,它不会做它(或以任何方式任何区别java.lang.Object为此事)是public相对于protected。我个人认为这是Java的设计缺陷。这确实在C#中已修复。问题不是为什么finalize要受到保护。没关系。真正的问题是您不应该能够通过基类类型的对象引用来在基类中调用受保护的方法。



 类似资料:
  • 问题内容: 定义为的受保护的具体原因是什么? 问题答案: 克隆受到保护的事实非常令人怀疑-事实是该clone方法未在Cloneable接口中声明。 它使该方法对于获取数据副本非常无用,因为你不能说: 我认为,Cloneable现在的设计在很大程度上被认为是一个错误(以下引用)。我通常希望能够实现接口的实现,Cloneable但不一定要实现接口Cloneable(类似于的使用Serializable

  • 问题内容: 有谁知道, 为什么 AbstractList (以及ArrayList)中的removeRange方法是?它看起来像是一个定义明确且有用的操作,但是仍然要使用它,我们不得不对List实现进行子类化。 有一些隐藏的理由吗?对我来说似乎莫名其妙。 问题答案: 是的,因为这不是您从外部代码中删除范围的方式。相反,请执行以下操作: 这实际上是在幕后。† OP询问为什么不属于公共API。原因在《

  • 问题内容: 关键字授予对相同包和子类(http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html)中的类的访问权限。 现在,每个类都有一个超类(http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html)。 因此,我得出结论,即使每个类都可以访问的方法。

  • 问题内容: 当我用方法覆盖方法时,Java编译器不会抱怨。这里到底发生了什么?由于父方法的可见性较低,它是覆盖还是隐藏父方法? 问题答案: 子类始终可以扩大访问修饰符,因为它仍然是超类的有效替代。从Java规范中有关覆盖和隐藏的需求: 覆盖或隐藏方法的访问修饰符(第6.6节)必须至少提供与覆盖或隐藏方法相同的访问权限,如下所示: 如果覆盖或隐藏方法是公共的,则覆盖或隐藏方法必须是公共的;否则,将发

  • 我熟悉。正如我在spring文档http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/aop.html中看到的,基于代理的概念。 在8.2.3.1支持的切入点指定器部分中,我发现了下面的注释 由于Spring的AOP框架的基于代理的性质,受保护的方法根据定义是不被拦截的,对于JDK代理(如果这不适用)和CGL

  • 问题内容: 默认方法是Java工具箱中一个不错的新工具。但是,我试图编写一个定义方法版本的接口。Java告诉我,这是禁止的,因为in中声明的方法可能无法编辑。为什么会这样呢? 我知道有一个“基类始终获胜”规则,因此默认情况下(pun;),方法的任何实现都会被该方法覆盖。但是,我认为没有理由为什么规范中的方法不应有例外。特别是因为它具有默认实现可能非常有用。 那么,Java设计者决定不允许方法覆盖方