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

2022-08-31 07:13:06

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

private protected someMethod() {

}

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

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

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


答案 1

删除访问修饰符

Java最初确实有修饰符,但它在JDK 1.0.2(第一个稳定版本,我们今天所知道的Java 1.0)中被删除了。一些关于 JDK 1.0.2 的教程(这里这里)是这样说的:private protected

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

关于 SoftwareEngineering.SE 的另一个答案是:

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

现在看一下 Java 版本历史记录

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文档中搜索它,您将找不到它,因为如前所述,它在JDK 1.0.2(也称为Java 1.0)中被删除了。当您查看所发布链接的“上次修改时间”时,这再次得到证明。您发布的链接最后一次修改是在 1996 年 2 月。Java 1.0/JDK 1.0.2 在被删除时,是在 1996 年 2 月之后发布的,根据规范,1996 年 8 月发布。private protected

删除原因

一些来源也解释了原因,比如这个。引用:private protected

什么是私人保护?

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

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

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

解释

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


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

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

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


答案 2

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

其中一个来自你放的普林斯顿来源,也来自麻省理工学院的档案,指出:

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

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

我的猜测是,这个功能没有进入官方的1.0版本,因为官方语言规范是从1996年8月开始的,而普林斯顿源代码最后一次修改是在1996年2月

PS:为Oracle删除旧版本的存档而感到羞耻。


推荐