为什么Java中的“protected”修饰符允许访问同一个包中的其他类?

时间:2009-05-24 02:18:58

标签: java inheritance protected

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

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

6 个答案:

答案 0 :(得分:23)

这种设计基于这样的想法:包是适当的单位,由一个内部一致的团队维护和发布;继承关系与谁在维持和释放什么时间的关系要少得多。

答案 1 :(得分:23)

修饰语描述得很好at http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html。从那里我们看到这个数字。

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

由此可见设计决策的原因很明显:它是一个很好的对称矩阵。

答案 2 :(得分:14)

在Java 1.0中,有第五个访问修饰符:private protected。这是protected没有默认访问权限。显然它从来没有真正正常工作,并在1.1中被删除。所以看起来protected的定义是按照总排序的方式定义的假设是虚假的。 (编辑:看来,在1.1中删除第五个访问修饰符的原因中至少有一个原因是缺少总排序干扰了重载选择规则。)module访问权限Java 7中的修饰符在这方面有一些设计问题。

鉴于认为成员的默认访问修饰符为“包私有”是个好主意,protected至少应具有此访问级别似乎是合理的。对于我的钱,protected根本不会用语言支付费用。

答案 3 :(得分:7)

基本上它与包作为api控制单元的视图有关(因此建议使用您的域名启动您的包 - 保证全局唯一性),因此可见性从私有增长 - > package-private - >受保护的 - >上市。如果受保护不是增加包私有,而是增加不同类型的可见性,则必须有某种方式在需要时组合两种类型的可见性。

答案 4 :(得分:1)

鉴于渐进级别的访问,私有,包,受保护和公共,如果它受到保护然后打包将会不必要地限制,因为这将迫使我允许子类访问以便授予同一包的其他成员。然而,直观地说,应该是同一个包中的其他类比“那里”的其他类更值得信赖。所以在包和公共之间受到保护,因为它允许更广泛的访问。

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

答案 5 :(得分:0)

Java确实遵循其设计原则。当您尝试减少/缩小子类中公共方法的范围时会发生什么?一个人得到一个错误。 Java范围修饰符级别如下:private< (默认)<受保护的<公众

包中的所有课程都应该是友好的,因为它们一起工作。要使成员在包中可用,它将在默认范围内定义。

子类可以位于包外部,再次遵循范围级别:private< (默认)<受保护的<公众 - 我们无法缩小范围。受保护的范围比默认范围更广,因此 Java与其自己的指南不矛盾。因此,受保护的成员将在默认范围内可用。另外:class<包<项目

请不要将修饰符限制为仅可见性,但继承,结构也同时工作并将它们添加到图片中。如果是这样的话:私人<受保护的< (默认)<上市。那么所有子类都必须驻留在同一个包中,那么为什么你需要继承你可以访问所有东西,因为默认范围适用于包级别。默认范围将失去其值,继承也是如此。