class Test {
int a;
void method() {
a = 1;
int a = a = 2;
a = 3;
}
}
a
ä¸æœ‰è®¸å¤šmethod
。他们都在指什么?
ç”案 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);
}
我个人更希望看到代ç 的第二ç§å½¢å¼ï¼Œå› 为对第一ç§å½¢å¼çš„评估似乎很晦涩。