我见过一些引用引用Java中的访问修饰符private protected
(两个词在一起):
private protected someMethod() {
}
我发现的其中一个页面是here。我的课程也提到了这个访问修饰符(并说它存在)。但是,使用它会导致Java语言出错。
我尝试了变量和方法,我很确定它不存在,但我想要解释发生了什么。它被考虑了,然后被拒绝了吗?或者是否在较新版本的Java中删除了它?
修改:我不是在寻找有关protected
关键字的信息。
答案 0 :(得分:190)
Java最初拥有private protected
修饰符,但在JDK 1.0.2(第一个稳定版本,我们今天所知的Java 1.0)中删除了它。关于JDK 1.0.2(here和here)的一些教程说明如下:
注意: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
的原因,例如this。private protected
。引用:
什么是私人保护?
早期,Java语言允许某些修饰符组合,其中一个是
private protected
。protected
的含义是严格限制子类的可见性(并删除包访问)。后来认为这有些不一致且过于复杂,不再受支持。[5][5] Java的Beta2版本中
private protected
修饰符的含义发生了变化,protected
组合同时出现。他们修补了一些潜在的安全漏洞,但让很多人感到困惑。
SoftwareEngineering.SE也支持这一点,它说它不值得不一致和额外的复杂性,所以它很早就被删除了。
我对这一切的解释是,也许,在橡树时代,两者都被允许共存(因此组合)。由于private
的含义已经改变 1 ,因此可能需要同时允许protected
和protected
。介绍变得过于复杂,并不值得,因此最终被删除了。当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 here或here的任何官方文档中都没有指定此功能。
我的猜测是这个功能没有达到官方1.0版本,因为官方语言规范是从1996年8月开始的,普林斯顿源是最后一次修改on February 1996。
PS:对Oracle删除旧版本的存档感到遗憾。
答案 2 :(得分:11)
正如您在问题中提供的链接建议private protected
用于element/member
课程,当您希望subclass
能够访问该元素但保持隐藏其package
中的其他类。
Java
相比, C++
有一个额外的封装元素概念 - 那就是包。当Java
,private
和public
等访问说明符出现时,我们还应该了解protected
中包内外可访问的内容。 func webViewDidFinishLoad(_ webView: UIWebView) {
if let cookies = HTTPCookieStorage.shared.cookies {
for cookie in cookies {
print("cookie= \(cookie)")
}
}
}
。
请注意,我已解释了为何使用它。当然不是当前版本
答案 3 :(得分:0)
不,您不能同时使用private
和protected
。你的教程很奇怪。你所拥有的是所谓的包私有或在ot6引用包受保护的访问。这是在没有明确写入acc6限定符时启用的默认访问。
答案 4 :(得分:-2)
私有范围与现有类有关。其中受保护的可以在包内进行访问,类可以通过其他包中的类进行扩展。
无缝地,如果您希望您的变量/方法在包外部访问,则需要将其定义为protected / public,否则为private或其他访问说明符。
受保护的方法通常可以从外部包和子类中访问,即类必须扩展各自的类以使用受保护的定义方法。
私有方法/变量在类中具有范围。它们不能在课堂外访问。
因此您无法同时定义Private Protected!