为什么";“受保护”;Java中的修饰符是否允许访问同一包中的其他类?

为什么";“受保护”;Java中的修饰符是否允许访问同一包中的其他类?,java,inheritance,protected,Java,Inheritance,Protected,在Java中,具有“protected”修饰符的成员不仅可以被同一类和子类访问,而且可以被同一包中的每个人访问,原因是什么 我想知道语言设计的原因,而不是实际的应用程序(例如,测试)这个设计基于这样一个理念,即包是适当的单元,由一个内部一致的团队维护和发布;继承关系与谁在何时维护和发布内容的关系要小得多。基本上,它与将包视为api控制单元的观点有关(因此建议使用域名启动包-保证全局唯一性),因此可见性从private->package private->protected->public开始增长

在Java中,具有“protected”修饰符的成员不仅可以被同一类和子类访问,而且可以被同一包中的每个人访问,原因是什么


我想知道语言设计的原因,而不是实际的应用程序(例如,测试)

这个设计基于这样一个理念,即包是适当的单元,由一个内部一致的团队维护和发布;继承关系与谁在何时维护和发布内容的关系要小得多。

基本上,它与将包视为api控制单元的观点有关(因此建议使用域名启动包-保证全局唯一性),因此可见性从private->package private->protected->public开始增长。如果protected不是包private的增加,而是一种不同类型的可见性,那么在需要时,必须有某种方式将这两种类型的可见性结合起来。

考虑到访问的渐进级别,private、package、protected和public,如果它受保护,那么它将受到不必要的限制,因为这将迫使我允许子类访问,以便授予相同包的其他成员。然而,凭直觉,应该是同一个包中的其他类比“外面”的其他类更值得信任。包装和公众之间的保护是如此之好,因为它允许更广泛的接触


我认为基本原因在于直觉,即同一个包中的类之间有一个基本的“信任”;您可以合理地期望他们彼此做正确的事情-在大多数情况下,包将由单个工程师或团队负责,因此设计应保持一致的协调。

修改器描述得很好。从这里我们可以看到这个数字

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 1.0中有第五个访问修饰符:
私有保护的
。这是受保护的,没有默认访问权限。显然,它从来没有真正正常工作,并在1.1下降。因此,似乎声称
受保护的
是按照总排序的方式定义的,这似乎是虚假的。(编辑:在1.1中删除第五个访问修饰符的原因似乎至少有一个是因为缺少总排序干扰了重载选择规则。)Java 7中的
模块
访问修饰符在这方面有一些设计问题


考虑到成员的默认访问修饰符被认为是“包私有”的一个好主意,
protected
应该至少具有这种访问级别,这似乎是合理的。就我而言,
protected
在该语言中根本不起作用。

Java本身就遵循它的设计原则。当您试图减少/缩小子类中公共方法的范围时会发生什么?一个人会犯错误。 Java范围修饰符级别如下:private<(默认) 所有的班级都应该是友好的,因为他们在一起工作。要使某个成员在包中可用,它在默认范围中定义

子类可能位于包之外,再次遵循作用域级别:private<(默认)Java不违背其自身的指导原则。因此,受保护的成员将在默认范围内可用。另外:类<包<项目


请不要将修改器仅限于可见性,同时继承、结构也在工作中,并将它们添加到图片中。如果这是真的:private+1坦白说,我也想知道原因。它总是让我觉得是Java中最愚蠢的设计决策之一。@cletus:我思考的时间越长,我就越得出结论,“包私有”是一个没有经过深思熟虑的想法。对于实际工作的“包私有”并提供任何类型的真正保护,包需要在单个编译单元中编译。我从来没有听说过这个,但是我在1.1的时候进入了Java。。。谢谢由于没有人阻止您向不同jar文件中的包添加更多类,“package private”也不完全是私有的。事实上:除了私有和公共之外的任何东西或多或少都是对程序员的一种暗示,但没有真正的保护。这是一个很晚才提出的问题,但是你有这方面的资料吗?“我现在想更详细地描述一下当时失败的原因和原因。”PieterDeBie回忆道。大约22年前,我将我正在进行的内部项目从1.0升级到1.1。bugs.sun.com只给了我“私有保护”被删除,以简化规范的其他部分-例如,关于覆盖的规则要求访问保护具有可比性(即,严格地弱于或强于彼此)。@Martin您可以在清单中将罐子标记为“密封”,以防止任何添加。当然,可以修改jar本身——包括类文件。除非您对jar进行签名,否则在这种情况下,您不能使用不同的签名(假设签名已验证)将任何类添加到同一运行时包中。另外,来自不同类加载器的任何类都将位于不同的运行时包中。@Michael Myers:不,无论如何它都不是对称的。它是对称的,这是有原因的。如果你在
受保护的
->包的交叉点放一个N而不是一个Y,它仍然是对称的