为什么包可见性优先于子类可见性?
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 隐藏东西的能力,同时仍然让你的同伴可以在包中使用它们。
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 隐藏东西的能力,同时仍然让你的同伴可以在包中使用它们。