【问题标题】:Why is package visibility given priority over subclass visibility?为什么包的可见性优先于子类的可见性?
【发布时间】:2015-09-02 21:51:23
【问题描述】:

This answer 显示了 Java 的可见性修饰符及其含义:

Modifier    | Class | Package | Subclass | World
————————————+———————+—————————+——————————+———————
public      |  y    |    y    |    y     |   y
————————————+———————+—————————+——————————+———————
protected   |  y    |    y    |    y     |   n
————————————+———————+—————————+——————————+———————
no modifier |  y    |    y    |    n     |   n
————————————+———————+—————————+——————————+———————
private     |  y    |    n    |    n     |   n

我的问题是,为什么允许对所有子类的可见性意味着您必须对包中的所有其他类提供可见性?换句话说,为什么 Java 的创造者会这样做,而不是:

Modifier    | Class | Subclass | Package | World
————————————+———————+—————————-+——————————+———————
public      |  y    |    y    |    y     |   y
————————————+———————+—————————+——————————+———————
no modifier |  y    |    y    |    y     |   n
————————————+———————+—————————+——————————+———————
protected   |  y    |    y    |    n     |   n
————————————+———————+—————————+——————————+———————
private     |  y    |    n    |    n     |   n

【问题讨论】:

标签: java visibility


【解决方案1】:

一个包应该是由同一个团队编写和维护的;假设程序员对所有代码有深入的了解,可以在包内进行更宽松的访问控制。

子类通常由其他人编写;对 API 的约束越严格越好。

【讨论】:

    【解决方案2】:

    因为像你建议的那样反过来在实践中没有意义(我承认这并不那么明显)。

    假设您有一个包,其中包含一个供客户(第三方、其他团队等)扩展的基类,以及与基类交互的其他类(在同一个包中)。这是很常见的情况。

    现在,您的基类可能包含仅供包中提供的代码使用的成员/方法,但扩展类的客户端无法访问这些成员/方法。

    现在使用包私有(默认)修饰符很简单,但是如果您切换强度,那将是不可能。您将失去对子类隐藏内容的能力,同时仍使包中的同伴可以使用它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-27
      • 2020-10-30
      • 2011-07-15
      • 2015-01-02
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 2016-03-17
      相关资源
      最近更新 更多