这里指的是什么å˜é‡ï¼Ÿ

时间: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);
}

我个人更希望看到代ç çš„第二ç§å½¢å¼ï¼Œå› ä¸ºå¯¹ç¬¬ä¸€ç§å½¢å¼çš„评估似乎很晦涩。