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