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

15

这个答案展示了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

2
参见:http://programmers.stackexchange.com/questions/205646/in-java-why-were-protected-members-made-accessible-to-classes-of-the-same-packa和http://programmers.stackexchange.com/questions/238581/why-is-there-no-subclasses-only-access-modifier-in-java - assylias
“为什么Java的创造者会这样做”,在我看来,这里没有人能回答这个问题。 :) - Bhesh Gurung
2个回答

11

一个软件包应该由同一团队编写和维护; 假设程序员对所有代码都有深入了解,那么在软件包内部可以放宽访问控制。

子类通常是由其他人编写的; 对API施加更严格的限制更好。


1
因为像你所建议的那样反过来做,在实践中是没有意义的(我承认这不是很明显)。假设你有一个包,其中包含一个基类,旨在由客户端(第三方、其他团队等)扩展,以及与基类交互的其他类(在同一个包中)。这是一个非常常见的情况。现在,你的基类可能包含仅供包中提供的代码使用的成员/方法,但这些成员/方法打算对扩展类的客户端不可访问。使用默认的包私有修饰符很容易实现,但如果你改变了强度,这将是不可能的。你将失去隐藏子类中的内容,同时仍然使它们可用于包中的伙伴的能力。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接