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

时间:2017-01-02 18:16:29

标签: java access-modifiers

我见过一些引用引用Java中的访问修饰符private protected(两个词在一起):

private protected someMethod() {

}

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

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

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

5 个答案:

答案 0 :(得分:190)

删除访问修饰符

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

  

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

另有answer on SoftwareEngineering.SE个州:

  

Java最初有这样的修饰符。它写成private protected但在Java 1.0中被删除。

现在看一下Java Version History

  

JDK 1.0

     

第一个版本于 1996年1月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 documentation中搜索它,则无法找到它,因为如前所述,它已在JDK 1.0.2中删除,也称为Java 1.0。当您查看" Last Modified"您发布的链接的时间。您发布的链接最后一次修改于1996年2月。当移除private protected时,Java 1.0 / JDK 1.0.2在1996年2月之后发布,根据规范,8月1996年。

删除原因

有些消息来源也解释private protected的原因,例如thisprivate protected。引用:

  

什么是私人保护?

     

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

     

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

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

解释

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

1 Oak Language Specification第4.10节访问变量和方法中,注意默认修饰符为private protected:< / p>

  

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

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

答案 1 :(得分:52)

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

其中一个来自您放置的普林斯顿来源,也来自MIT archives,其中包含:

  

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

但是,在Java 1.0 herehere的任何官方文档中都没有指定此功能。

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

PS:对Oracle删除旧版本的存档感到遗憾。

答案 2 :(得分:11)

正如您在问题中提供的链接建议private protected用于element/member课程,当您希望subclass能够访问该元素但保持隐藏其package中的其他类。

如果与Java相比,

C++有一个额外的封装元素概念 - 那就是。当Javaprivatepublic等访问说明符出现时,我们还应该了解protected中包内外可访问的内容。 func webViewDidFinishLoad(_ webView: UIWebView) { if let cookies = HTTPCookieStorage.shared.cookies { for cookie in cookies { print("cookie= \(cookie)") } } }

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

答案 3 :(得分:0)

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

答案 4 :(得分:-2)

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

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

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

私有方法/变量在类中具有范围。它们不能在课堂外访问。

因此您无法同时定义Private Protected!