这里指的是什么变量?

时间:2018-09-21 07:44:27

标签: java language-lawyer language-specifications

class Test {
  int a;

  void method() {
    a = 1;
    int a = a = 2;
    a = 3;
  }
}

a中有许多method。他们都在指什么?

1 个答案:

答案 0 :(得分:3)

这是Java范围规则异常的简单示例。

a = 1;
int a = a = 2;
a = 3;

逐行分解:

  • a = 1;是指成员变量。
  • a = 3;引用局部变量,因为它在局部变量的声明之后。您可以通过相同的标识符以相同的方法引用两个不同的符号,这非常令人困惑。
  • int a = a = 2;:第二个a局部变量

变量声明中的自引用确实很好奇。您可以找到以下in the language spec

  
      
  • 一个块中的局部变量声明的范围(第14.4节)是该声明出现在该块的其余部分,以其自己的初始化程序开始,并在其中包含右侧的任何其他声明符局部变量声明语句。
  •   

成员变量可以在自己的初始化程序中引用自己也是正确的。但这是出于稍微不同的原因:

  
      
  • 在类类型C(第8.1.6节)中声明或继承的成员m的声明的范围是C的整个主体,包括任何嵌套的类型声明。
  •   

对于局部变量,该规则的存在还没有找到令人信服的理由;也许您只是真的要确保已分配它。我认为它允许您执行的唯一操作是在初始化程序的评估中将变量用作临时存储,例如:

int a = method(a = somethingThatIsReallyExpensiveToCompute(), a);

将等同于:

int a;
{
  int tmp = somethingThatIsReallyExpensiveToCompute();
  a = method(tmp, tmp);
}

我个人更希望看到代码的第二种形式,因为对第一种形式的评估似乎很晦涩。