2011-01-07 79 views
4

我得到了這種情況,我不知道陰影。例如下面的代碼有關變量範圍和陰影在java中的問題

class Foo { 
    int a = 5; 
    void goFoo(int a) { 
     // No problem naming parameter as same as instance variable 
     for (int a = 0; a < 5; a++) { } 
     //Now the compiler complains about the variable a on the for loop 
     // i thought that the loop block had its own scope so i could shadow 
     // the parameter, why the compiler didnt throw an error when i named 
     // the parameter same as the instance variable? 
    } 
} 

謝謝你por耐心。

回答

2
void goFoo(int a) { 

     for (int a = 0; a < 5; a++) { } 

} 

它類似於在相同的範圍的a

void goFoo() { 
     int a; 
     for (int a = 0; a < 5; a++) { } 

} 

所以多個聲明,這是不能接受的。

或者乾脆就類似於

void goFoo() { 
    int a; 
    int a; 
} 

請參見

0

但你不申報的第二個 「一」 在新的範圍,如你的代碼所示。它在goFoo()塊本身的範圍內。

11

你可以製作一個局部變量來映射一個實例/靜態變量 - 但是你不能讓一個局部變量(你的循環計數器)影響另一個局部變量或參數(你的參數)。

從Java語言規範,section 14.4.3

如果聲明爲一個局部變量的名稱已經被聲明爲字段名,則該外聲明在整個範圍陰影(第6.3.1節)局部變量。

注「字段名」的一部分 - 它指定它必須是一個被遮蔽。

而且從section 8.4.1

的方法(§8.4.1)或構造的參數的範圍(§8.8.1)是方法或構造的整個身體。

這些參數名稱不能重新聲明爲方法的局部變量,或者作爲方法或構造函數的try語句中的catch子句的異常參數。

(它接着談地方類和匿名類,但他們是在你的案件無關。)

1

變量的範圍取決於塊的層次結構爲好。

即如果u使用這樣

void goFoo(int a) { 
     // No problem naming parameter as same as instance variable 
     for (int b = 0; b < 5; b++) { } 
     //Now the compiler complains about the variable a on the for loop 
     // i thought that the loop block had its own scope so i could shadow 
     // the parameter, why the compiler didnt throw an error when i named 
     // the parameter same as the instance variable? 

     int b; // you can do this. 

    } 

也就是說,如果一個變量是在外部塊中聲明,那麼你不能在聲明這是內部的塊相同。另一種方式,你可以做到這一點。

0

問題不是循環遮蔽了類字段,名稱已被參數使用。

兩種選擇:一種是改變循環:

for (a = 0; a < 5; a++) { } 

此使用參數作爲索引變量。不清楚爲什麼你會有一個參數,但都一樣...

另一種選擇是重命名循環變量或參數爲別的。

0

這不是陰影,這是一個衝突。 a都在方法範圍內。無法在同一範圍內定義兩個同名的變量。