Java 7规范:变量标识符是名称,但字段名称不是?为什么?

时间:2014-05-25 08:58:11

标签: java java-7 jls

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   出现在“。”之前。令牌

  •   
  • ...

  •   

所以,我的问题是:局部变量和字段之间区别的原因是什么?

1 个答案:

答案 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 的字段,然后发生编译时错误。

[等等。等]