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

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

我想知道语言devise的原因,而不是实际的应用(如testing)

这个devise是基于这样一个想法,即这个包是适当的单元,由一个内部一致的团队维护和发布; inheritance关系与谁维护和释放什么时候关系较小。

这些修饰符在http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html中有详细描述。; 从那里我们看到这个数字。

Modifier Class Package Subclass World public YYYY protected YYYN no modifier YYNN private YNNN 

从这个devise决定的原因是显而易见的:它有一个很好的对称matrix。

在Java 1.0中有第五个访问修饰符: private protected 。 这是protected没有默认访问。 显然它从来没有正常工作,并在1.1下降。 所以它看起来像protected被定义为整体sorting似乎是虚假的方式。 Java 7中的module访问修饰符在这方面有一些devise问题。

考虑到认为成员的默认访问修饰符是“封装私有”是一个好主意, protected应该至less具有这种访问级别似乎是合理的。 对于我的钱来说, protected的语言根本不会付出代价。

基本上它与一个包作为api控制单元的视图有关(因此build议您使用您的域名启动您的包 – 保证全球唯一性),因此可见性从私有 – >包 – 私有 – >保护 – >公共。 如果被保护的不是包私有的增加,而是不同types的可见性,那么在需要的时候就必须有某种方法来结合这两种可见性。

鉴于渐进级别的访问,私有,包装,保护和公共,如果它受到保护,然后封装,将是不必要的限制,因为这将迫使我允许子类访问,以授予同一包的其他成员。 然而,从直观上看,同一套餐中的其他class级应该比“在那里”的其他class级更值得信赖。 因此,受保护的软件包和公众之间的关系就是允许更广泛的访问。

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

Java确实遵循其自身的devise原则。 当你尝试缩小/缩小一个子类的公共方法的范围时会发生什么? 一个得到一个错误。 Java范围修饰符级别如下:private <(default)<protected <public

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

一个子类可能会驻留在包之外,再次遵循范围级别:private <(default)<protected <public – 我们不能缩小范围。 受保护的范围比默认范围更广,因此Java不会违背其自己的准则 。 因此,受保护的成员将在默认范围内可用。 另外:class <package <Project。

请不要将修饰符限制为只有可见性,但是inheritance,结构同时也在工作,并将它们添加到图片中。 如果这是真的:private <protected <(default)<public。 那么所有的子类将不得不驻留在相同的包中,那么为什么你需要inheritance你可以访问的一切,因为默认的作用域在那里适用于包级别。 默认范围将失去其价值,inheritance也是如此。