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
第一个版本于1996年1月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 protected
。private protected
的含义是将可见性严格限制为子类(并删除包访问)。 这后来被认为有些不一致,过于复杂,不再支持。[5]
protected
修饰符的含义在Java的Beta2版本中发生了变化,private protected
组合同时出现。 他们修补了一些潜在的安全漏洞,但让很多人感到困惑。
而SoftwareEngineering.SE也支持这一点,说这不值得不一致和额外的复杂性,所以它在早期被删除。
解释
我对这一切的解释是,也许在橡树时代,两者都被允许共存(因此也就是组合)。 由于protected
的含义已经改变1 ,因此可能需要同时允许private
和protected
。 介绍变得太复杂了,不值得,最后被抛弃了。 到了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 。 当涉及private
, public
和protected
访问说明符时,还应该理解Java
的包内外可访问的内容。
请注意,我已经解释了为什么使用它。 不在目前的版本当然
不,你不能同时使用private
protected
。 你的教程很奇怪。 你所拥有的就是所谓的包私有或在ot6引用包保护访问。 这是在没有明确写入acc6限定符时启用的默认访问。
私人范围是与现有的类。 其中受保护的可以在包中进行访问,并且可以通过其他包中的类进行扩展。
无缝地,如果你想要你的variables/方法在包之外访问,你需要定义为protected / public,否则私有或一些其他的访问说明符。
受保护的方法通常可以从外部包和子类中访问,即一个类必须将相应的类扩展到可用的受保护的已定义方法。
私人方法/variables在课堂上有范围,他们不能在课堂外进行访问。
因此,你不能同时定义私有保护!