代码之家  ›  专栏  ›  技术社区  ›  flow2k

Java文学中“可见性”模糊的含义?

  •  2
  • flow2k  · 技术社区  · 8 年前

    首先,一点背景。据我所知,有两个相关但截然不同的概念:
    1。 可达性 . 这与 public , protected , private 控制对类成员和类本身的访问。
    2。 命名 . 给定一个实体首先是可访问的,这关系到简单名称还是完全限定名称(比如 myOrg.myPackage.myClass )需要使用,并且与 import 语句,它允许使用简单的名称。

    爪哇“能见度”的一个定义涉及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不受任何其他声明的影响 在下午

    根据这个定义,即使 myMember 在我的 公众的 myClass 被宣布 公众的 ,它将被视为不可见,因为不能用简单的名称引用它(必须使用 myOrg.myPackage.myClass.myMember )

    我对“可见性”这两个词的解释是否正确?这两个词的语义不同,用法含糊不清?我很难使他们和解。

    1 回复  |  直到 8 年前
        1
  •  3
  •   Stephen C    8 年前

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

    正如@ Read DeF注意到的,您已经链接到Java 8 JLS。在Java 9和以后,术语“可见性”不再用于谈论声明的范围和隐藏。“可见性”一词现在用于两种情况:

    • 当讨论从不同的Java 9 +模块中看到哪些包和类时,
    • 在谈论Java内存模型上下文中不同线程对变量的可见性时。

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


    要实现的第二件事是Java教程主要是编写为 可以理解 由初级和中级Java程序员。因此,他们有时使用的术语 标准化 ,有时他们会说一些技术上不正确或过于简化的话。

    差异可能是故意的,也可能是疏忽,也可能只是“有人”没有及时更新教程。我的理解是不同的人/组负责规范和教程。当然,不一样 技能 需要编写/编辑这两组文档,因为(部分)文档面向不同的受众。


    底线:

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

    2. 带着一点盐来做辅导。它们不是决定性的。