Java访问修饰符优先级

标签 java architecture modifiers

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/

相关文章:

java - RSS 阅读器 Rome 无法处理 UTC 时间戳

java - Swagger/OpenAPI 注释 V3 - 在 swagger 注释中使用枚举值

java - 使用 Mule ESB 找不到与代理名称匹配的主题备用 DNS 名称

spring - 识别 Spring MVC 架构模式

Javassist - 从方法中删除静态修饰符

java - 为 logInInBackground 解析抛出 NullPointerException

c# - 配置设置和 IoC

c# - 领域驱动设计中层与层之间的数据传输对象

c# - 在控制台中检测 Ctrl + S

Webmethods 中的正则表达式修饰符