在Java中,我们有四个访问说明符:public
,protected
,package-private(默认)和private
。这是well known,对我来说不是问题。
我的问题是关于protected
的命名。如the table here所示,给一个字段package-private的默认访问说明符可以防止包外的子类使用它,但是应用关键字protected
实际上并不保护它 - 相反,它将它打开到任何包的子类。
那么,为什么不protected
保护事物;为什么较少限制性而非根本没有修饰符?
答案 0 :(得分:6)
如果我们接受那些应该存在的四个访问级别(private,package-private,package-private-plus-subclasses和public),我们接受package-private应该是你的默认访问级别不要指定别的东西,那么这个问题变成:“为什么package-private-plus-subclasses被称为protected
?”答案就是它从C ++中借用/继承了这个术语(它没有“包”的概念,但使用protected
来表示“私有加子类”)。
(我将这个答案作为社区维基发布,以鼓励其他人加入它,因为我猜这个故事不仅仅是这个。还有,因为有人可能想补充一些理由说明为什么这些是应该存在的四个访问级别 - 例如,为什么我们有package-private-plus-subclasses但没有私有加子类 - 以及为什么package-private应该是默认值。)
答案 1 :(得分:3)
由于这是一个相当开放的问题,我将提供一些半相关的历史背景。在Java 1.0中,有一个额外的访问修饰符,私有保护。这是受保护的减去包访问。这个修饰符令人困惑,执行不力并被1.1删除。这有助于描绘包是逻辑模块单元的图像,因此是默认的访问级别。
在一天结束时,它归结为个人选择对开发人员有意义的事情。每个人都有不同的想法,所以对我来说完全合理的命名惯例可能会让你感到非常困惑(反之亦然)。
答案 2 :(得分:1)
受保护比公众更具限制性。这就是它被称为原因的原因。
我希望语言设计者将默认访问说明符命名为“package-protected”,因为默认情况下很多程序员都很困惑。我会更赞成保护是默认的,或者没有默认情况下。