Java 是否有一个“私有保护”访问修饰符?

我看到一些引用指的是 Java 中名为 private protected的访问修饰符(两个词放在一起) :

private protected someMethod() {


}

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

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

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

12587 次浏览

删除访问修饰符

Java 最初有 private protected修饰符,但是在 JDK1.0.2(第一个 稳定版本,我们今天所知道的 Java 1.0)中删除了它。一些关于 JDK 1.0.2(给你给你)的教程说明如下:

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

另一个 Softwareengineering.se 回答指出:

Java 最初有这样一个修饰符,它被写成了 private protected,但是在 Java 1.0中被移除了。

现在看看 Java 版本历史记录:

JDK 1.0

第一个版本在 1996年1月23日上发布,名为 Oak.第一个稳定版本 JDK 1.0.2被称为 Java1。

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

现在,如果您尝试在 Java 1.0文档中搜索它,您将找不到它,因为正如前面提到的,它在 JDK1.0.2中被删除,也称为 Java1.0。当你查看你发布的链接的“最后修改”时间时,这一点再次得到了证明。你发布的链接最后一次修改是在1996年2月。Java 1.0/JDK 1.0.2,当 private protected被移除时,发布了 在1996年2月之后,并且根据规范,在1996年8月。

移除原因

一些资料也解释了 private protected的原因,例如 这个1:

什么是私人保护?

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

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

Softwareengineering.se 也支持这一观点,他们认为这种不一致和额外的复杂性是不值得的,所以这种观点很早就被删除了。

解释

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


橡木语言规格,Section 4.10,访问变量和方法中,我们注意到默认的修饰符是 protected:

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

这与我们今天使用的默认包访问非常不同。这可能为 private protected的需要铺平了道路,因为 private的限制太多,而 protected太宽松。

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

其中一个,来自你提供的普林斯顿资料,还有来自 麻省理工学院档案馆的,指出:

注意: Java 语言的1.0版本支持五种访问 级别: 上述四个级别加上私人保护。私人保护 受保护的访问级别在 Java 更高版本中不受支持 而不是1.0; 您不应该再在 Java 程序中使用它。

但是,Java 1.0 给你给你的任何官方文档都没有具体说明这一特性。

我的猜测是,这个特性没有进入官方1.0版本,因为官方语言规范是从1996年8月开始的,而 Princeton 源代码是最后一次修改的 一九九六年二月

附言: 甲骨文删除旧版本的存档是一种耻辱。

正如你在问题中提供的链接所暗示的那样,当你希望你的 subclass能够访问元素,但是在它的 package中对其他类保持隐藏的时候,private protected被用在了一个类的 element/member上。

如果与 C++相比,Java有一个额外的封装元素的概念——那就是 包裹。当涉及到这些访问规范(如 privatepublicprotected)时,人们还应该了解在 Java中的包内外可访问的内容。

请注意,我已经解释了为什么使用它。当然不是在目前的版本

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

私有作用域在现有类中。其中 Protected 可以在包中访问,并且可以由其他包中的类扩展的类访问。

如果希望在包之外访问变量/方法,则需要将其定义为 protected/public,否则为 private 或其他访问说明符。

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

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

因此不能同时定义私有保护!