为什么Java的“受保护”受保护的程度低于默认值?

在Java中,我们有四个访问说明符: publicprotected ,package-private(默认)和private 。 这是众所周知的 ,对我来说不是问题。

我的问题是关于protected的命名。 如下表所示,给一个字段package-private的默认访问说明符可以防止包外的子类使用它,但是应用关键字protected实际上并不保护它 – 相反,它将它打开到子类任何包裹。

那么,为什么不protected保护东西; 为什么它比没有修饰符的限制更少

如果我们接受那些应该存在的四个访问级别(private,package-private,package-private-plus-subclasses和public),并且我们接受package-private应该是默认访问级别指定别的东西,然后这个问题变成:“为什么package-private-plus-subclasses被称为protected ?” 答案就是它从C ++中借用/inheritance了这个术语(它没有“包”的概念,但使用protected来表示“私有加子类”)。

(我将这个答案作为社区维基发布,以鼓励其他人加入它,因为我猜这个故事不仅仅是这个。还有,因为有人可能想要为这四个访问添加一些理由应该存在的级别 – 例如,为什么我们有package-private-plus-subclasses但没有private-plus-subclasses – 以及为什么package-private应该是默认值。)

由于这是一个相当开放的问题,我将提供一些半相关的历史背景。 在Java 1.0中,有一个额外的访问修饰符,私有保护。 这是受保护的减去包访问。 这个修饰符令人困惑,执行不佳并被1.1删除。 这有助于描绘包是逻辑模块单元的图像,因此是默认的访问级别。

在一天结束时,它归结为个人选择对开发人员有意义的东西。 每个人都有不同的想法,所以对我来说完全合理的命名惯例可能会让你感到非常困惑(反之亦然)。

受保护的限制比公众更严格。 这就是为什么它被称为它的原因。

我希望语言设计者将默认访问说明符命名为“受包保护”,因为默认情况下很多程序员都很困惑。我会更赞成保护是默认的,或者根本没有默认值。