【问题标题】:Access modifiers inheritance: on abstract methods访问修饰符继承:关于抽象方法
【发布时间】:2015-02-09 00:46:10
【问题描述】:

一方面,我有一个带有抽象方法的抽象类。 另一方面,我有一个子类,它覆盖了抽象方法并为其指定了“公共”访问修饰符。

我赋予原始抽象类的抽象方法的可见性是否有意义?

【问题讨论】:

  • 嗯,是的;虽然您可以扩大已实现方法的可见性,但不能限制它。注意接口中的方法默认也是public abstract,所以接口的所有实现都必须有public修饰符(即使接口本身的可见性没有限制)
  • 好吧,如果我的孩子要公开,那么我不知道我应该为父母的访问者申请什么最佳实践
  • 我想我应该问我的问题是我是否想限制在包中仅使用该方法的可能性

标签: java inheritance methods polymorphism abstract


【解决方案1】:

在 Java 中,允许子类在重写方法时“增加”方法的可见性,但不能“减少”它。 IE。 protected 方法可以被覆盖并设为public,但public 方法不能被覆盖并设为protected

保持超类方法protected(这里不需要超类或方法abstract)的含义是它允许子类覆盖该方法并保持protected或使其成为public .如果超类创建方法public,那么这会强制任何覆盖该方法的子类使该方法保持public

JLS, Section 8.4.8.3,涵盖了这些要求:

覆盖或隐藏方法的访问修饰符(第 6.6 节)必须提供至少与覆盖或隐藏方法一样多的访问权限,如下所示:

  • 如果被覆盖或隐藏的方法是公共的,那么覆盖或隐藏的方法必须是公共的;否则,会发生编译时错误。

  • 如果覆盖或隐藏的方法是受保护的,那么覆盖或隐藏的方法必须是受保护的或公开的;否则,会发生编译时错误。

  • 如果被覆盖或隐藏的方法具有包访问权限,则覆盖或隐藏方法不能是私有的;否则,会发生编译时错误。

【讨论】:

  • 嗯...有一个例外。如果我将方法设为私有:)。我真的很想有一种机制来强制“对我的孩子使用私有方法”
  • 但是private 方法不能被覆盖。重写 private 方法是没有意义的,因为它只能在定义它的类中访问。
  • 这就是我这么说的原因,因为私有是指与其他情况(修饰符本身作为下限转发)完全相同的方法,所以没有办法让继承的方法私有-作用域
  • 不,不能继承方法private
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 2017-08-17
  • 2013-09-27
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 2018-06-26
相关资源
最近更新 更多