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 出现在“。”之前。令牌
...
所以,我的问题是:局部变量和字段之间区别的原因是什么?
答案 0 :(得分:3)
重要的部分是:
§6.5的规则区分名称必须表示的上下文 (参考)一个包(第6.5.3节),一个类型(第6.5.5节),一个变量或值 表达式(§6.5.6),或方法(§6.5.7)。
在此上下文中对字段的引用 name ,因为它是表达式中的值。 (§6.5.6)
有很多要点可以在§6.5.6中解释,我在下面突出显示了一些粗体:
6.5.6.1。简单表达式名称
如果表达式名称由单个标识符组成,则必须存在 正好是一个表示局部变量的声明, 参数,或字段可见(§6.4.1)在 标识符发生。否则,发生编译时错误。
如果声明表示实例变量(第8.3节),则表达式 name必须出现在实例方法的声明中(§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 的字段,然后发生编译时错误。
[等等。等]