Java 为什么包可见性优先于子类可见性?

Java 为什么包可见性优先于子类可见性?,java,visibility,Java,Visibility,显示Java的可见性修饰符及其含义: Modifier | Class | Package | Subclass | World ————————————+———————+—————————+——————————+——————— public | y | y | y | y ————————————+———————+—————————+——————————+——————— protected | y | y |

显示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

一个包应该是由同一个团队编写和维护的;假设程序员对所有代码都很熟悉,那么在一个包中有更宽松的访问控制是可以的


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

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

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

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


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

另请参见:“…为什么Java创建者会这样做”,IMHO,这里没有人能回答这个问题。:)