【问题标题】:Does Java have a "private protected" access modifier?Java 是否有“私有保护”访问修饰符?
【发布时间】:2017-05-16 20:07:06
【问题描述】:

我看到一些参考文献提到了 Java 中称为 private protected 的访问修饰符(两个词一起):

private protected someMethod() {

}

我发现其中一个提到这个的页面是here。我的学校课也提到了这个访问修饰符(并说它存在)。但是,使用它会导致 Java 语言出错。

我尝试了变量和方法,我很确定它不存在,但我想解释发生了什么。考虑过,然后拒绝?还是在较新版本的 Java 中被删除了?

编辑:我不是在寻找有关 protected 关键字的信息。

【问题讨论】:

  • 您找到的页面设置了“Last-Modified”HTTP 标头:Mon, 26 Feb 1996 18:14:04 GMT!
  • @Joe 我完全赞成在可能的情况下以骗子的身份结束问题,但我没有看到任何关于组合 private protected 修饰符的内容。
  • @jpmc26 请参阅“在 Java 1.0 中,有一个额外的访问修饰符,私有保护。”但是,这里的答案是对历史的更好总结。
  • @Joe 在那个答案中确实提到了private protected,但它没有解释为什么或发生了什么,这个问题是关于什么的。
  • 有没有其他人觉得 OP 在学校里学习这个很可怕......从文档中删除 20 多年后?有趣的历史课,但仍然有点害怕人们正在学习在 Java 1 命名之前被删除的东西......

标签: java access-modifiers


【解决方案1】:

移除访问修饰符

Java 最初确实有 private protected 修饰符,但它在 JDK 1.0.2(第一个 稳定 版本,我们今天所知道的 Java 1.0)中被删除。一些关于 JDK 1.0.2(herehere)的教程说如下:

注意:Java 语言的 1.0 版本支持五个访问级别:上面列出的四个加上private protected。高于 1.0 的 Java 版本不支持 private protected 访问级别;你不应该再在你的 Java 程序中使用它。

另一个answer on SoftwareEngineering.SE 表示:

Java 最初有这样的修饰符。它是写成 private protected,但在 Java 1.0 中被删除。

现在看看Java Version History

JDK 1.0

第一个版本于 1996 年 1 月 23 日发布,名为 Oak。 第一个稳定版本 JDK 1.0.2 称为 Java 1。

由此,我们可以得出结论,关于版本 1.0.2 的教程指的是第一个版本 JDK 1.0,其中语言称为 Oak,但 SoftwareEngineering.SE 的版本指的是第一个稳定版本 JDK 1.0。 2 称为 Java 1.0,并在其中被删除。

现在如果您尝试在Java 1.0 documentation 中搜索它,您将找不到它,因为如前所述,它已在 JDK 1.0.2(也称为 Java 1.0)中被删除。当您查看您发布的链接的“上次修改时间”时,再次证明了这一点。您发布的链接最后一次修改是在 1996 年 2 月。Java 1.0/JDK 1.0.2,当 private protected 被删除时,在 1996 年 2 月之后发布,根据规范,1996 年 8 月.

移除原因

有些资料也解释了private protected的原因,比如this之一。引用:

什么是私人保护的?

早期,Java 语言允许某些修饰符组合,其中之一是 private protectedprivate protected 的含义是严格限制对子类的可见性(并删除包访问)。这后来被认为有些不一致且过于复杂,因此不再受支持。[5]

[5]protected修饰符的含义在Java的Beta2版本中发生了变化,同时出现了private protected组合。他们修补了一些潜在的安全漏洞,但让很多人感到困惑。

SoftwareEngineering.SE 也支持这一点,表示不值得出现不一致和额外的复杂性,因此很早就将其删除。

解读

我对这一切的解释是,在橡树时代,也许两者都被允许共存(因此组合在一起)。由于protected 的含义已更改1,因此可能需要同时允许privateprotected。介绍变得太复杂,不值得,所以最后被放弃了。在 Java 1.0/JDK 1.0.2 推出时,它已被删除,因此无法在文档中找到。


1Oak Language Specification,第 4.10 节,访问变量和方法中,注意到默认修饰符是protected

默认情况下,类中的所有变量和方法都受到保护

这与我们今天的默认包访问完全不同。这可能为private protected 的需要铺平了道路,因为private 过于严格而protected 过于宽松。

【讨论】:

  • 我确信它不值多少钱——但我记得它发生的时候(我小时候编程,出于某种原因非常喜欢这个新的 Java 事物),虽然我找不到任何原始来源 - 当我关注他们时,我记得完全一样的事情。
  • Early on, the Java language allowed for certain combinations of modifiers, 这是否意味着不仅仅是“私人保护”?
  • @XaolingBao 当然,一个访问者就像没有访问者:) 提供的链接应该澄清你的问题。
【解决方案2】:

有一些令人困惑/不清楚的故事:

一个,来自您提供的普林斯顿消息来源以及MIT archives,声明:

注意:Java 语言的 1.0 版本支持五访问 级别:上面列出的四个加上私有保护。私人的 更高版本的 Java 不支持受保护的访问级别 大于 1.0;你不应该再在你的 Java 程序中使用它。

但 Java 1.0 herehere 的任何官方文档中都没有指定此功能。

我的猜测是这个功能没有进入官方 1.0 版本,因为官方语言规范是从 1996 年 8 月开始的,而普林斯顿的源代码最后一次修改是 on February 1996

PS:Oracle 为删除旧版本的存档感到羞耻。

【讨论】:

  • 我的链接是相同内容的旧版本吗? :D
  • 可能缺少的信息与您放的那张纸条有关。
  • @AndrewLi 在给定的参考文献中,任何地方都没有声明为 stable。当有一个实际的 1.0 时,将 1.0.2 称为 1.0 肯定会令人困惑。
【解决方案3】:

正如您在问题中提供的链接所暗示的那样,private protected 用于类的 element/member,当您希望您的 subclass 能够访问该元素但在其 @987654325 中将其隐藏在其他类中时@。

JavaC++ 相比,有一个额外的封装元素的概念——那就是Package。当涉及到privatepublicprotected 等这些访问说明符时,人们还应该了解Java 中的包内部或外部可以访问的内容。

请注意,我已经解释了使用它的原因。当然不在当前版本中

【讨论】:

  • 我的链接用于方法访问。不是会员访问权限。
  • @MarkYisri 同样可以用于成员变量。访问说明符不仅适用于方法,也适用于成员变量。换句话说,访问说明符是一个封装概念,无论您将其应用于成员方法还是成员变量。这适用于几乎所有面向对象的语言,包括 C++ 和 java
  • 好的,但是本教程(有趣的是)没有提到变量的私有保护。稍等一下,我看看有没有变量页面...
【解决方案4】:

不,您不能同时使用 privateprotected。你的教程很奇怪。您所拥有的是所谓的包私有或在 ot6 引用包保护访问。这是在没有明确写入 acc6 限定符时启用的默认访问。

【讨论】:

  • 我知道你不能使用它。我想知道它发生了什么,其他答案解释得更好。
  • 嗯,这个链接是 1996 年的,所以考虑到 Java 开发大约一年前才开始,链接的内容并不奇怪:D
  • 关于每个文档的日期的好点。我在我的火车到达时回答了这个问题并用电话写了它,如果答案不够出轨,很抱歉。只是想帮忙...
  • @AlexR 你的拼写错误 derailed 实际上是一个双关语(火车)。刚注意到。 :D
  • @MarkYisri,详细。使用手机写作并不是在 SO 上发布答案的最佳方式。
【解决方案5】:

私有作用域属于现有类。其中 Protected 可以在包内访问,也可以在其他包中的类扩展的类中访问。

如果您希望您的变量/方法可以在包之外进行访问,您需要将其定义为受保护的/公共的,否则是私有的或其他一些访问说明符。

受保护的方法通常可以从外部包和子类中访问,即一个类必须扩展各自的类才能使用受保护的定义方法。

私有方法/变量在类内有作用域。它们不能在类外访问。

因此您不能同时定义 Private Protected!

【讨论】:

  • 这没有回答问题。我问为什么它不起作用。其他答案在回答问题方面做得更好。
  • 为了进一步澄清,我知道它现在不再有效,但其他答案解释了过去发生的原因和情况。你的没有。
猜你喜欢
  • 2016-04-03
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 2015-11-26
  • 2017-12-22
  • 2013-04-03
相关资源
最近更新 更多