Java 访问修饰符隐式地赋予包相对于子类的访问优先级,因为 default 修饰符允许访问包而不是子类,protected 允许访问两者,但有没有允许访问子类但不允许访问包的修饰符。这对我来说一直感觉很奇怪,因为我自然倾向于认为子类“更接近”父类(即使它们毕竟是它们自己的变量),然后是同一个包中的类,并且经常我发现自己处于这样的情况:希望有 sub 的修饰符,但没有包的修饰符。 这可能意味着我以“错误”的方式使用包,但是有人可以向我解释这个决定背后的逻辑吗?
最佳答案
当您使用protected
修饰符时,您将授予对该类的无限制访问权限。即使该类不适合子类化,只要您愿意,也可以扩展它。当您使用 protected
修饰符时,您实际上是在说该类(在可预见的将来)始终适合子类化。这可能不是您想要的;例如,如果您有一个类应该为一个项目扩展几次,之后就不再扩展。
当您没有修饰符(default-access/package-private)时,您将授予对该类的有限访问权限。没有人,甚至是您,都无法访问包之外的该类,如果您正在执行类似上述情况的操作,那么您会希望看到这种情况,其中该类特定于您的项目并将其扩展为任何其他任意项目是不合适的。以下是从最高访问权限到最低访问权限的列表:
public
:对所有人和所有事物进行无限制的访问protected
:无限制访问,但限制更多- default-access:对有限数量的其他类的有限访问
私有(private)
:访问极其有限:任何东西都无法访问
在 protected
和 default-access 之间添加第五个访问修饰符,以便每个希望扩展它的类都可以访问它,但如果不想扩展则无法访问它它是多余的,因为它已经以公共(public)摘要
的形式存在。
关于Java访问修饰符优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38401626/