使用继承时,访问修饰符在哪些情况下会有所不同



我使用Java已经有一段时间了,大部分都是自学成才的。但我对访问修饰符有点困惑,这让我很困扰,因为我本周晚些时候要参加OCA考试,这是我唯一不太擅长的话题
如果我们有一个具有受保护方法的类,并且我们扩展该类并使用public覆盖该方法,那没关系。我们从具有受保护的方法变成了public方法。我的问题是,在其他什么情况下,访问修饰符可以不同?

提前感谢!

JLS 8.4.8.3给出了确切的规则。覆盖和隐藏中的要求。

重写或隐藏方法的访问修饰符必须提供至少与重写或隐藏的方法一样多的访问,如下所示:

  • 如果覆盖或隐藏的方法是public,则覆盖或隐藏方法必须是public;否则,将发生编译时错误
  • 如果被覆盖或隐藏的方法是protected,则覆盖或隐藏方法必须是protectedpublic;否则,将发生编译时错误
  • 如果被重写或隐藏的方法具有包访问权限,则重写或隐藏方法不得为private;否则,将发生编译时错误

必须是这样。如果您可以用更严格的访问覆盖方法,这将违反Liskov可替代性原则(LSP(。LSP说,只要可以使用超类型的实例,就应该能够使用子类型的实例。

相关内容

最新更新