2011-10-29 100 views
1
class Grade { 
public static int f = 2; 

public static void main(String[] args) { 
    for (int f = 0; f < 2; f++) { 
     System.out.println(f); 
    } 
} 
} 

它是怎麼發生的,「int f」是否覆蓋靜態變量f?我認爲static int f被整個類共享,編譯器爲什麼不給出這個變量被重新定義的錯誤消息?爲什麼它不會成爲靜態f的重複?我認爲,在Java中,範圍塊繼承其父塊的變量。Java中的變量範圍

回答

5

這是因爲當地f,「陰影」的外部範圍f。這意味着只要在本地定義它之後引用f,它就會引用本地版本。

維基百科上關於可變陰影頁面使用了一個非常類似的例子在Java中:

http://en.wikipedia.org/wiki/Variable_shadowing

編輯:Grade.f:如果您需要「外」 f,你可以通過它更合適的名稱來訪問它。沒有靜態變量類似的例子:

public class Grade { 
    public int f=0; 
    public void setF(int f) { 
    this.f = f; // setF(5) will set the 「outer」 f to 5. 
    } 
} 
+0

謝謝。有什麼可讀的嗎? –

+0

維基百科頁面應該很清楚。除了知道陰影如何(以及在​​哪裏)發揮作用之外,沒有什麼別的了。 – Mysticial

+0

@ArtemMoskalev Java語言問題的官方來源是Java語言規範(又名JLS)。有關您的問題,請參閱第6.3.1節。 http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.3.1 –

0

即使變量是靜態的,作用域告訴編譯器該行

System.out.println(f); 

作品與內部變量,而不是更通用的一個。這是要避免的 - 以他們的名字變得混亂的方式命名變量。

+0

我想是這樣的......這只是SCJP的一個問題......我有點困惑...... 。 –