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

问题描述 投票:0回答:6

在Java中,带有“protected”修饰符的成员不仅可以被同一个类和子类访问,而且可以被同一个包中的每个人访问,这是为什么呢?

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

java inheritance protected
6个回答
26
投票

此设计基于这样的理念:包是适当的单元,由一个内部一致的团队维护和发布;继承关系与谁在何时维护和释放什么关系不大。


25
投票

这些修饰符在 Java 教程 中有详细描述。从那里,我们看到这张表:

修改器 班级 套餐 子类 世界
public
protected
N
无修饰语 N N
private
N N N

由此可见,设计决策的原因很明显:有一个漂亮的对称矩阵。


16
投票

在 Java 1.0 中,有第五个访问修饰符:

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

考虑到成员的默认访问修饰符被认为是“package private”是一个好主意,

protected
应该至少具有这种访问级别似乎是合理的。就我的钱而言,
protected
根本无法在语言中获得回报。


7
投票

基本上,它与将包视为 api 控制单元有关(因此建议使用域名启动包 - 保证全局唯一性),因此可见性从 private -> package-private -> protected -> 增长民众。如果 protected 不是对包私有的增强,而是一种不同类型的可见性,则必须有某种方法在需要时结合这两种类型的可见性。


1
投票

考虑到私有、包、受保护和公共的渐进级别的访问权限,如果先受保护然后再包,这将是不必要的限制,因为这将迫使我允许子类访问,以便授予同一包的其他成员。然而,直观上来说,同一包中的其他类应该比“外面”的其他类更值得信赖。包和公共之间受到如此保护,因为它允许更广泛的访问。

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


0
投票

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

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

子类可以驻留在包之外,再次遵循范围级别:私有< (default) < protected < public - We can not narrow down the scope. Protected is broader scope than default so Java并不与它自己的准则相矛盾。因此,受保护的成员将在默认范围内可用。另外:类< package < Project.

请不要将修饰符限制为仅可见性,继承、结构也同时起作用并将它们添加到图片中。如果这是真的:私人< protected < (default) < public. then all sub classes would have to reside in same package, then why you need to inherit you can access everything as default scope is there at applicable at package level. Default scope would have lost its value and so does inheritance.

© www.soinside.com 2019 - 2024. All rights reserved.