【问题标题】:Why is Java's "protected" less protected than default? [closed]为什么 Java 的“受保护”的受保护程度低于默认值? [关闭]
【发布时间】:2023-04-09 14:56:01
【问题描述】:

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

我的问题是关于protected 的命名。如the table here 所示,为字段提供 package-private 的默认访问说明符可防止包外的子类使用它,但应用关键字 protected 实际上并不能保护它——相反,它会打开它到任何包的子类。

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

【问题讨论】:

  • 与公共相比,它受到保护...
  • publicprotectedprivate 访问级别是从 C++ 复制而来的。包私有是 Java 独有的。我猜他们使用与 C++ 相同的名称只是为了熟悉并且不想为包级别添加语法。
  • 如果默认情况下受保护,您可以问同样的问题。我不明白为什么这是一个问题
  • 因为设计语言的人决定这样做。

标签: java terminology semantics access-specifier


【解决方案1】:

受保护的比公开的限制更多。这就是为什么它被称为它是什么。

我希望语言设计者将默认访问说明符命名为“包保护”,因为默认设置让很多程序员感到非常困惑。我更倾向于将 protected 设置为默认设置,或者没有完全默认。

【讨论】:

    【解决方案2】:

    如果我们接受应该存在的四种访问级别(私有、包私有、包私有加子类和公有),并且我们接受包私有应该是您的默认访问级别不指定其他内容,那么这个问题就变成了:“为什么 package-private-plus-subclasses 叫protected?”答案是它借用/继承了 C++ 的术语(它没有“包”的概念,但使用protected 表示“私有加子类”)。

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

    【讨论】:

      【解决方案3】:

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

      归根结底,这归结为对开发人员有意义的个人选择。每个人的想法都不一样,所以对我来说完全合理的命名约定可能会让你非常困惑(反之亦然)。

      【讨论】:

      猜你喜欢
      • 2016-09-13
      • 2011-01-17
      • 2011-11-15
      • 2012-01-17
      • 1970-01-01
      • 2011-10-02
      • 2012-09-27
      • 2018-05-04
      • 2016-02-19
      相关资源
      最近更新 更多