当前位置: 首页 > 知识库问答 >
问题:

为什么我可以用公共方法重写受保护的方法?

充子航
2023-03-14

当我用公共方法重写受保护的方法时,Java编译器不会抱怨。这里到底发生了什么?由于父方法的可见性较低,它是覆盖还是隐藏父方法?

共有3个答案

楚嘉
2023-03-14

可见性只影响外部可访问性。作为public方法,任何外部类都可以调用它。

重写方法的访问级别不影响原始方法的可见性。重写后,对于任何访问级别,只能通过在子类中调用Super来访问原始方法。

冯亮
2023-03-14

从外部类的角度来看,public方法只是一个新方法,而不是覆盖方法,因为外部类无论如何都无法访问受保护的方法。

另一方面,不允许降低可见性,因为外部类始终可以使用超类类型的引用来引用子类的对象并调用相同的方法。

周良弼
2023-03-14

子类总是可以扩大访问修饰符,因为它仍然是超类的有效替代。从Java关于覆盖和隐藏中的需求的规范中:

覆盖或隐藏方法的访问修饰符(§6.6)必须提供至少与覆盖或隐藏方法相同的访问权限,如下所示:

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

  • 问题内容: 出于好奇, 为什么将方法的访问修饰符设置为。为什么不能呢?有人可以向我解释这背后的任何具体原因吗? 另外,我知道该方法仅被调用一次。如果我在程序内部两次调用它,会发生什么情况?垃圾收集器会再次调用吗? 问题答案: 我用另一个问题回答您的问题: 为什么方法不应该受到保护? 通常,您应该尝试使事物尽可能私密。这就是封装的全部意义所在。否则,您 什么都 可以做。不能(因为派生类应该能够访问它

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

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

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

  • 问题内容: 可以将方法指定为私有方法还是受保护方法? 会编译吗? 它会运行吗? 问题答案: 它会编译,不会运行(使用Eclipse测试)。