Java是否具有"私有保护"访问修饰符?

160 java access-modifiers

我看到一些引用引用了Java中的访问修饰符private protected(两个单词一起):

private protected someMethod() {

}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Li3*_*357 191

删除访问修饰符

Java最初有private protected修改器,但它在JDK 1.0.2(第一个稳定版本,我们今天所知的Java 1.0)中被删除了.有关JDK 1.0.2(此处此处)的一些教程说明如下:

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

SoftwareEngineering.SE的另一个答案是:

Java最初有这样一个修饰符.它是private protected在Java 1.0中编写但删除的.

现在来看看Java Version History:

JDK 1.0

第一个版本于19961月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文档中搜索它,您将无法找到它,因为如前所述,它已在JDK 1.0.2中删除,也称为Java 1.0.当您查看所发布链接的"上次修改时间"时,会再次证明这一点.你发布的链接最后一次修改是在1996年2月.当private protected被删除时,Java 1.0/JDK 1.0.2在1996年2月之后发布,根据规范,1996年8月.

移除原因

一些消息来源也解释了原因private protected,例如这个.报价:

什么是私人保护?

早期,Java语言允许某些修饰符组合,其中之一是private protected.意思private protected是将可见性严格限制为子类(并删除包访问).后来认为这有点不一致和过于复杂,不再受支持.[5]

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

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

解释

我对这一切的解释是,也许,在橡树时代,两者都被允许共存(因此组合).由于protected的含义发生了变化1,有可能是一个需要允许privateprotected在同一时间.介绍变得过于复杂,不值得,因此最终被删除了.当Java 1.0/JDK 1.0.2推出时,它已被删除,因此无法在文档中找到.


1Oak语言规范的第4.10节" 访问变量和方法"中,注意默认修饰符为protected:

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

这与我们今天的默认包访问完全不同.这可能为需要铺平了道路private protected,因为private限制太多而且protected过于宽松.


m0s*_*it0 52

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

其中一个来自普林斯顿来源,也来自麻省理工学院档案馆,其中指出:

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

但是此处此处未在Java 1.0的任何官方文档中指定此功能.

我的猜测是,这个功能没有达到官方的1.0版本,因为官方语言规范是从1996年8月开始的,普林斯顿源是在1996年2月修改的.

PS:对Oracle删除旧版本的存档感到羞耻.


Gam*_*ads 10

由于您在问题中提供的链接建议private protected用于element/member某个类,当您希望您subclass能够访问该元素但将其隐藏在其中的其他类时package.

Java如果相比C++有一个额外的封装元素的概念 - 这是一个.人们还应该理解内或包外什么是可访问的Java,当涉及到这些访问修饰符如private,publicprotected.

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