Java:没有包访问的子类访问

Inn*_*ate 10 java access-modifiers

相当新的Java,但我想知道为什么包访问被认为比子类访问"更具限制性".也就是说,为子类提供对成员访问权限的每个访问修饰符也为整个包提供访问权限,并且存在提供包访问但不提供子类访问的修饰符.

这不是完全倒退吗?假设我在某个包中有一个类ControlledInstantiation.如果我有另一个类AlsoControlledInstantiation扩展ControlledInstantiation,我无法调用ControlledInstantiation的构造函数,除非我将其设置为protected或public.如果我将它设置为protected,那么包中的任何其他类都可以根据需要经常实例化它.因此,对于其超类(和语法,是)必须替代的东西获得与超类相同或更少的访问权限,而不是服务于不同但相关的函数的东西.这就像告诉你的孩子他不能玩你的钱包,因为你不会让你的邻居这样做,然后让你的邻居睡在你的房子,因为你的孩子.

所以我想我在问,这个决定的动机是什么,我怎么能绕过它呢?

Nat*_*man 3

乍一看似乎有些倒退,但其思想是 Java 包应该包含一组在语义上相关的相对内聚的类,这反映在默认的包修饰符中。那么逻辑是,如果您想更进一步并允许任何包中的子类查看您的成员,您可以将它们声明为受保护的。来自外部包的子类应该比来自您自己的包的任何类(无论是否是子类)更不受信任,这对您来说有意义吗?

事实上,Java 曾经有一个private protected修饰符,它可以实现你所追求的目标,但我想它被删除了,因为它让人们感到困惑。我不太确定如何在不将每个类/子类对归入其自己的包的情况下实现这一目标。但这是一个混乱的解决方案,违背了 Java 的原则,而且它不适用于两个以上类的继承层次结构。