2011-10-29 4 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を上書きしますか?静的int fはクラス全体で共有されていると思います。なぜコンパイラがこの変数が再定義されたというエラーメッセージを出さないのですか?なぜそれは静的なfの複製にならないのですか?私は、Javaではスコープブロックが親ブロックの変数を継承すると考えました。Javaの変数スコープ

答えて

5

これはローカルfの "影"が外側の範囲fであるためです。これは、ローカルで定義した後にfを参照するたびに、ローカルバージョンを参照することを意味します。変数シャドウイングの

Wikipediaのページには、Javaで非常によく似た例を使用しています。

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

EDIT: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

変数が静的である場合でも、スコープはその内側の変数ではなく、より一般的な1とのラインが

System.out.println(f); 

作品コンパイラに指示します。それは、名前を混乱させるように変数を命名することを避けるべきことです。

+0

私はそう思います。それはSCJPからの単なる質問でした...私は混乱しました。 。 –