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

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

 private protected someMethod() { } 

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

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

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

删除访问修饰符

Java最初拥有private protected修饰符,但在JDK 1.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版本历史logging :

JDK 1.0

第一个版本于19961月23日发布,称为橡树。 第一个稳定版本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文档中进行search,您将无法find它,因为如前所述,在JDK 1.0.2中已将其删除,也称为Java 1.0。 当您查看您发布的链接的“上次修改时间”时,再次certificate了这一点。 您发布的链接是在1996年2月份最后修改的.Java 1.0 / JDK 1.0.2在private protected被删除后,于1996年2月之后发布,并且按照规范,1996年8月发布。

拆除的理由

有些消息来源也解释了private protected的原因,比如这个 。 去引用:

什么是私人保护?

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

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

而SoftwareEngineering.SE也支持这一点,说这不值得不一致和额外的复杂性,所以它在早期被删除。

解释

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


1在“ 橡树语言规范 ”第4.10节“ 访问variables和方法”中 ,注意到默认修饰符是protected

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

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

有混乱/不清楚的故事:

一个是从普林斯顿的资料来源,另一个是麻省理工学院的档案 ,他说:

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

但是在这里或这里的 Java 1.0的任何官方文档中都没有指定这个特性。

我的猜测是,这个function并没有达到官方的1.0版本,因为官方语言规范是从1996年8月开始的,普林斯顿的源程序是在1996年2月最后修改的。

PS:甲骨文公司为删除旧版本的档案而感到羞耻。

正如您在问题中提供的链接所暗示的那样,如果您希望您的subclass能够访问该元素,但是使其隐藏在其package其他类中,则隐式private protected被用在类的element/member上。

Java如果与C++相比有一个额外的封装元素的概念 – 那就是一个Package 。 当涉及privatepublicprotected访问说明符时,还应该理解Java的包内外可访问的内容。

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

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

私人范围是与现有的类。 其中受保护的可以在包中进行访问,并且可以通过其他包中的类进行扩展。

无缝地,如果你想要你的variables/方法在包之外访问,你需要定义为protected / public,否则私有或一些其他的访问说明符。

受保护的方法通常可以从外部包和子类中访问,即一个类必须将相应的类扩展到可用的受保护的已定义方法。

私人方法/variables在课堂上有范围,他们不能在课堂外进行访问。

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