java - Java文献中 "visibility"的含义不明确?

标签 java terminology

首先,介绍一下背景。根据我的理解,有两个相关但不同的概念:
1.辅助功能。这涉及使用 publicprotectedprivate 来控制对类成员和类本身的访问。
2.命名。假设一个实体首先是可访问的,这涉及是否需要使用简单名称或完全限定名称(如 myOrg.myPackage.myClass ),并与导入相关联> 语句,允许使用简单的名称。

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

The scope is the part of the program text within which the declared entity can be referred to by a simple name.

A declaration d is said to be visible at point p in a program if the scope of d includes p, and d is not shadowed by any other declaration at p.

根据这个定义,即使我的 publicmyClass 中的 myMember 被声明为 public,它也会不被视为可见,因为它不能通过简单的名称引用(必须使用 myOrg.myPackage.myClass.myMember)。

我的解释是否正确,“可见性”一词的这两种用法具有不同的语义并且使用含糊不清?我无法协调它们。

最佳答案

Oracle Java 教程似乎是“实时文档”,没有明显的版本编号。一般来说,它们应该被理解为描述 Java 的“当前”版本;即最新规范描述的版本。因此,您应该将这些教程与 Java 语言规范 (JLS) 的 Java 10 版本进行比较。

正如 @Radiodef 所指出的,您已链接到 Java 8 JLS。在 Java 9 及更高版本中,术语“可见性”不再用于谈论声明的作用域和隐藏。术语“可见性”现在用于两种情况:

  • 当谈论哪些包和类在不同的 Java 9+ 模块中可见时,以及
  • 在谈论 Java 内存模型上下文中不同线程的变量更改的可见性时。

您在 Java 8 JLS 中发现的“可见性”用法不再适用。 (是的,术语发生了变化。)


要认识到的第二件事是 Java 教程主要是为了初学者和中级 Java 程序员可以理解而编写的。因此,他们有时使用不标准化的术语,有时他们所说的内容在技术上不正确或过于简单化。

差异可能是故意的,也可能是疏忽,或者可能只是“某人”在更新教程方面落后了。我的理解是不同的人/团体负责规范和教程。当然,编写/编辑这两组文档需要不同的技能,因为(部分)这些文档针对不同的受众。


底线:

  1. 如果您想要/需要技术上正确的 Java 术语,请参阅 JLS 的最新版本中的定义。

  2. 对教程持保留态度。它们不是确定的。

关于java - Java文献中 "visibility"的含义不明确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50663436/

相关文章:

java - 随机 JVM 崩溃,堆栈仅显示 Hibernate 数据

java - 只调用一次的代码块-值得拥有自己的方法吗?

oop - 析构函数还是解构函数?

java - Java中的匿名类和闭包有什么区别?

java - 缩短switch case方法

java - 如何引用 GridPane 中的特定节点

Java - 可序列化并通过套接字发送对象

language-agnostic - 什么是绿地和棕地应用?

java - Java中的无状态对象是什么?

computer-science - 做/确定某事 "programmatically"是什么意思?