Java是否具有“专用保护”访问修饰符?


160

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

private protected someMethod() {

}

我发现与此有关的页面之一在这里。我的学校课上也提到了这个访问修饰符(并说它存在)。但是,使用它会导致Java语言错误。

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

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


60
您找到的页面设置了“ Last-Modified” HTTP标头,该标头是:1996年2月26日星期一18:14:04 GMT!
G.西尔维·戴维斯

6
@Joe我全力以赴以尽一切可能来结束问题,但是我看不到有关组合修饰符的任何信息private protected
jpmc26

2
@ jpmc26请参阅“在Java 1.0中,有一个附加的访问修饰符,受私有保护。” 但是,这里的答案是对历史的更好总结。

2
@Joe的private protected答案中确实有提及,但没有解释为什么或发生了什么,这个问题是关于什么的。
m0skit0

3
其他人是否会感到恐惧,因为OP被从文档中删除后20多年才在学校里学习。有趣的历史课,但仍然让人有些恐惧,因为人们正在学习在Java 1被命名之前被删除的东西……
XaolingBao

Answers:


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版本历史记录

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月。Java 1.0 / JDK 1.0.2 private protected被删除后,于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发行时,它已被删除,因此无法在文档中找到。


1在《Oak语言规范》第4.10节“ 访问变量和方法”中,应注意默认修饰符为protected

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

这与我们今天的默认程序包访问权限完全不同。这可能为的需求铺平了道路private protected,因为private它过于严格且protected过于宽容。


我确定这并不值钱-但是我记得它发生的时间(我还是个小孩子的时候就出于某种原因热衷于这个新的Java东西),虽然我找不到任何原始资源-我仍然记得当我跟着他们时完全一样。
本杰明·格伦鲍姆

Early on, the Java language allowed for certain combinations of modifiers, 这是否意味着不仅仅是“私有保护”?
XaolingBao

@XaolingBao当然,一个访问者就像没有访问者一样:)提供的链接应该阐明您的问题。
m0skit0

52

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

其中之一是从您输入的普林斯顿资源以及麻省理工学院的档案中得出的:

注意:Java语言的1.0发行版支持五个访问级别:上面列出的四个级别以及受保护的私有级别。高于1.0的Java版本不支持私有受保护的访问级别。您不应再在Java程序中使用它。

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

我的猜测是,此功能没有成为正式的1.0版本,因为正式的语言规范是1996年8月的,普林斯顿的源代码是在1996年2月进行的

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


那么我的链接是同一内容的旧版本吗?:D

也许丢失的信息与您输入的注释有关。

@AndrewLi 在给定的引用中,任何地方都没有声明稳定。当实际有1.0时,将1.0.2称为1.0绝对令人困惑。
m0skit0

10

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

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

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


我的链接用于方法访问。不是会员访问权限。

1
@MarkYisri同样也可以用于成员变量。访问说明符不仅对方法起作用,而且对成员变量也起作用。换句话说,访问说明符是一个封装概念,并且与将其应用于成员方法还是成员变量无关。适用于几乎所有的面向对象的语言,包括C ++和Java的
programmer_of_the_galaxies

好的,但是本教程(有趣的是)没有提到受变量保护的私有。等等,让我看看是否有变量页面...


0

不,你不能同时使用private一个protected在一起。您的教程很奇怪。您所拥有的就是所谓的“程序包私有”或在ot6参考中的程序包保护访问。这是默认访问,当未明确编写acc6限定符时启用。


3
我知道您不能使用它。我想知道发生了什么,其他答案可以更好地说明。

4
好吧,该链接来自1996年,因此鉴于Java开发大约是在一年之前才开始的,所以链接的内容并不那么奇怪:D
Keiwan

6
关于该文件日期的要点。我在myou火车到达时回答了这个问题,并用电话写了这个问题,如果答案出轨还不够,抱歉。只是想帮助...
AlexR

6
@AlexR您的拼写错误出轨实际上是双关语。刚注意到。:D

1
@MarkYisri,详细。用电话写作不是在SO上发布答案的最佳方法。
AlexR

-2

私有作用域与现有类一起使用。其中受保护的可以在包内访问,并且可以通过其他包中的类扩展该类。

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

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

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

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


这没有回答问题。我问为什么它不起作用。其他答案在回答问题方面做得更好。

为了进一步澄清,我知道它现在不再起作用,但其他答案解释了过去发生的原因和发生的原因。你的不是。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.