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

Uri*_*Uri 43 java inheritance protected

在Java中,具有"受保护"修饰符的成员不仅可以由同一个类和子类访问,还可以由同一个包中的每个人访问?

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

Ale*_*lli 23

这种设计基于这样的想法:包装是适当的单元,由一个内部一致的团队维护和发布; 继承关系与谁维护和释放什么时候关系不大.

  • 谢谢你的回答.当然实际上并没有起作用,因为没有人阻止你在几个罐子上分发一个包装 - 并且在几个团队中使用它.所以这是另一个没有充分考虑的好主意.Java充满了一些东西. (2认同)

Gle*_*enn 23

修饰符在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
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您在“protected”-> Package 交叉点处放置 N 而不是 Y,它仍然是对称的。只是没那么漂亮而已。 (2认同)

Tom*_*ine 14

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

鉴于人们认为成员的默认访问修饰符为"包私有"是一个好主意,因此protected至少应该具有这种访问级别似乎是合理的.对于我的钱,protected根本不用语言支付.


Yis*_*hai 7

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

  • 但是没有人会阻止您向已经存在的包中添加新类。因此,“私有包”和“受保护”只是对程序员的建议。两者都没有提供任何真正的保护,防止恶意/绝望的程序员想要/需要调用该方法。— 像 C++ 中的“受保护”至少会强制使用子类 — 但在 Java 中您甚至不需要这样做。 (2认同)