为什么在 Java 中,带有“protected”修饰符的成员不仅可以被同一个类和子类访问,而且可以被同一个包中的每个人访问?
我想知道语言设计的原因,而不是实际的应用程序(例如,测试)
为什么在 Java 中,带有“protected”修饰符的成员不仅可以被同一个类和子类访问,而且可以被同一个包中的每个人访问?
我想知道语言设计的原因,而不是实际的应用程序(例如,测试)
这种设计基于包是适当的单元,由一个内部一致的团队维护和发布的想法;继承关系与谁维护和何时发布什么关系不大。
修饰符在 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
由此可见,设计决策的原因是显而易见的:要有一个很好的对称矩阵。
在 Java 1.0 中有第五个访问修饰符:private protected
. 这是protected
没有默认访问权限的。显然,它实际上从未真正正常工作,并在 1.1 中被删除。因此,似乎声称protected
以总排序的方式定义似乎是虚假的。(编辑:似乎在 1.1 中删除了第五个访问修饰符的至少一个原因是缺少总排序干扰了重载选择规则。)module
Java 7 中的访问修饰符在这方面有一些设计问题.
鉴于人们认为将成员的默认访问修饰符设置为“包私有”是一个好主意,因此protected
至少应该具有这种访问级别似乎是合理的。为了我的钱,protected
根本没有用语言支付。
基本上它与将包视为 api 控制单元有关(因此建议使用您的域名启动包 - 保证全局唯一性),因此可见性从私有 -> 包私有 -> 受保护 -> 公有增长. 如果受保护的不是对包私有的增加,而是一种不同类型的可见性,那么在需要时必须有某种方法来组合这两种类型的可见性。
考虑到访问级别,私有,包,受保护和公共的渐进级别,如果它受到保护然后包,这将是不必要的限制,因为这将迫使我允许子类访问以授予同一包的其他成员。然而,直观地说,同一个包中的其他类应该比“外面”的其他类更值得信赖。如此受保护的是在包和公共之间,因为它允许更广泛的访问权限。
我认为基本原因依赖于直觉,即同一个包中的类之间存在基本的“信任”水平。您可以合理地期望他们彼此做正确的事情 - 在大多数情况下,软件包将由单个工程师或团队负责,因此应该有一致的设计和谐。
Java 本身确实遵循其设计原则。当您尝试减少/缩小子类中公共方法的范围时会发生什么?一个错误。Java 范围修饰符级别如下:private < (default) < protected < public
包中的所有类都应该是友好的,因为它们一起工作。为了使包中的成员可用,它在默认范围内定义。
子类可能驻留在包之外,再次遵循范围级别: private < (default) < protected < public - 我们不能缩小范围。受保护的范围比默认范围更广,因此Java 不违背其自己的准则。因此,受保护的成员将在默认范围内可用。另外:类<包<项目。
请不要将修饰符限制为仅可见性,但继承、结构也在同时工作,并将它们添加到图片中。如果这是真的:private < protected < (default) < public. 那么所有子类都必须驻留在同一个包中,那么为什么需要继承你可以访问所有内容,因为默认范围适用于包级别。默认范围将失去其价值,继承也是如此。