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

Why is package visibility given priority over subclass visibility?

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

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

子类往往是别人写的;对 API 的约束越严格越好。

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

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

现在,您的基础 class 可能包含 members/methods 旨在 供程序包中提供的代码使用,但无法访问给扩展 class.

的客户端

像现在这样使用 package private(默认)修饰符很简单,但是如果你切换强度就不可能。你将失去对你的 child classes 隐藏东西的能力,同时仍然让你的同伴可以在包中使用它们。