【问题标题】:Java 7 specification: variable identifiers are names, but field names are not? Why?Java 7 规范:变量标识符是名称,但字段名称不是?为什么?
【发布时间】:2014-05-25 08:58:10
【问题描述】:

http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.2

规范说:

在确定名称的含义时(第 6.5 节),名称出现的上下文是 考虑到。 §6.5 的规则区分名称必须表示的上下文 (指)一个包(§6.5.3),一个类型(§6.5.5),一个变量或表达式中的值 (§6.5.6) 或方法 (§6.5.7)。

所以,据我了解,名称只能表示上述实体——不包含字段。

这似乎与下面的陈述一致:

并非程序中的所有标识符都是名称的一部分。标识符也用于 以下情况:

  • ...

  • 在字段访问表达式(第 15.11 节)中,标识符出现在“.”之后令牌 表示对象的成员,它是表达式的值或关键字 super 出现在“。”之前令牌

  • ...

那么,我的问题是:局部变量和字段之间存在这种区别的原因是什么?

【问题讨论】:

  • 你读过下面的例子和附带的解释吗?
  • 是的,这只让我更加困惑。如果你能指出它是如何回答我的问题的,那就太好了!

标签: java java-7 jls


【解决方案1】:

重要的部分是:

§6.5 的规则区分名称必须表示的上下文 (参考)一个包(§6.5.3),一个类型(§6.5.5),一个变量或值 表达式 (§6.5.6),或方法 (§6.5.7)。

在这种情况下,对字段的引用也是 名称,因为它是表达式中的值。 (§6.5.6)

第 6.5.6 节中有很多点对此进行了解释,我在下面用粗体突出了一些:

6.5.6.1。简单的表达式名称

如果表达式名称由单个标识符组成,则必须有 恰好是一个声明,表示局部变量, 参数或 可见字段 (§6.4.1) 标识符出现。否则,会发生编译时错误。

如果声明表示一个实例变量(第 8.3 节),则表达式 名称必须出现在实例方法的声明中(第 8.4 节), 构造函数(第 8.8 节)、实例初始化程序(第 8.6 节)或实例变量 初始化程序(第 8.3.2.2 节)。

[...]

6.5.6.2。限定表达式名称

如果表达式名称的形式为 Q.Id,则 Q 已经 分类为包名、类型名或表达式名。

[...]

如果 Q 是表达式名称,则令 T 为表达式 Q 的类型:

如果 T 不是引用类型,则会发生编译时错误。

如果不存在 T 类型的可访问(第 6.6 节)成员 这是一个名为 Id 的字段,则发生编译时错误。

[等等。等等]

【讨论】:

    猜你喜欢
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 2021-05-13
    • 1970-01-01
    相关资源
    最近更新 更多