java - Java 文献中“可见性”的含义不明确?
问题描述
首先,一点背景。据我了解,有两个相关但截然不同的概念:
1.可访问性。这与使用public
, protected
,private
来控制对类成员和类本身的访问有关。
2.命名。首先给定一个实体是可访问的,这与是否myOrg.myPackage.myClass
需要使用简单名称或完全限定名称(如 )有关,并且与import
允许使用简单名称的语句相关联。
Java 中“可见性”的一种定义涉及 #1:
https ://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html 。
但是,在 JLS 中,“范围”和“可见性”似乎与 #2 有关: https ://docs.oracle.com/javase/specs/jls/se8/html/jls-6.html#jls-6.4 .1
范围是程序文本的一部分,在该部分中声明的实体可以通过一个简单的名称来引用。
如果 d 的范围包括 p,并且 d 没有被 p 处的任何其他声明所遮蔽,则声明 d 在程序中的点 p 处可见。
根据这个定义,即使myMember
在我的public
类myClass
中声明public
了 ,它也不会被认为是可见的,因为它不能用简单的名称来引用(必须使用myOrg.myPackage.myClass.myMember
)。
我的解释是否正确,“可见性”一词的这两种用法带有不同的语义并且使用不明确?我很难调和它们。
解决方案
Oracle Java 教程似乎是没有公开版本编号的“实时文档”。一般来说,它们应该被理解为描述 Java 的“当前”版本;即最新规范所描述的版本。因此,您应该将这些教程与 Java 10 版本的 Java 语言规范 (JLS) 进行比较。
正如@Radiodef 所指出的,您已链接到 Java 8 JLS。在 Java 9 及更高版本中,术语“可见性”不再用于谈论声明的作用域和隐藏。“可见性”一词现在在两种情况下使用:
- 在讨论从不同的 Java 9+ 模块中可以看到哪些包和类时,以及
- 在讨论 Java 内存模型上下文中来自不同线程的变量更改的可见性时。
您在 Java 8 JLS 中找到的“可见性”的用法不再适用。(是的,术语发生了变化。)
第二件要意识到的是,Java 教程主要是为了让初学者和中级 Java 程序员能够理解而编写的。因此,他们有时会使用不规范的术语,有时他们会说技术上不正确或过于简单化的话。
差异可能是故意的,也可能是疏忽,或者仅仅是“某人”在更新教程方面落后了。我的理解是,不同的人/组负责规范和教程。当然,编写/编辑两组文档需要不同的技能,因为(部分)文档针对不同的受众。
底线:
如果您想要/需要技术上正确的 Java 术语,请参阅最新版本的 JLS 中的定义。
对教程持保留态度。它们不是确定的。
推荐阅读
- sql - 从 Oracle 中的会话中获取更改的对象
- python-3.x - 腌制深度学习模型时出现“TypeError:无法腌制弱引用对象”
- typescript - 具有动态字段名称的类型化 Zod 组合器
- performance - 如何使用 RcppParallel 调试持久的性能问题
- c++ - 如何访问作为枚举的嵌套模板参数?
- java - 在 Spring Boot 中使用不同数量的过滤器有效过滤数据
- swift - 为什么在 swift 中返回值时出现“void 函数中出现意外的非 void 返回值”错误?
- python - 如何在 REST api 请求中将 spacy doc 对象作为有效负载发送并在 api 中重建 spacy doc 对象?
- apache-kafka - 处理流向 Kafka 的流量的最佳方式是什么?
- python - dash 应用程序无法制作一个 Y 轴条格式