2011-03-04 8 views
2

Javaでスコープ規則を理解するのに役立つ人はいますか?Javaのスコープ規則

{ 
     int i = 0; 
     System.out.println(i); // fine, of course 
    } 
    System.out.println(i); // syntax error 

i{}内で宣言され、それが外に利用できません。これは明らかに有効ではありません。それでは、これはどうですか?

for (int i = 0; i < 10; i++) { 
     System.out.println(i); // fine, of course 
    } 
    System.out.println(i); // syntax error, same as above. 

ここでは構文エラーに驚いています。 iは外側のスコープで宣言されていますが、後で利用できません。 forループのいくつかの特別なルールによって内部ブロックスコープにバインドされていますか?これが起こる可能性がある他のシナリオはありますか?実際にこのように表さループのための

+2

「裸」 '{}'と '{}' *その他のキーワードや文法の生産に関連した違いがある* - つまり、それはで表示されなければなりません多くのケースが類似したセマンティクスを持っていても、文法のコンテキスト。 –

答えて

6

思う:

{ 
    int i = 0; 
    while (i < 10) { 
    // your code 
    i ++ 
    } 
} 
+1

はい、これはJLS(http://java.sun.com/docs/books/jls/third_edition/html/statements)でサポートされています。html#35529) "ForInitコードがローカル変数宣言の場合、ブロックに現れるローカル変数宣言文のように実行されます。 –

3

それはループのためにいくつかの特別なルールにより、内側のブロックスコープにバインドされますか?

はい、これはまさにそのケースです。

class Some { 
    public void x(int i) { 
    System.out.println(i); // valid 
    } 
    int j = i; // not valid 
} 

も参照してください:言語仕様から

は明らかにローカル変数宣言があります。

0

これはJavaのループforの定義された動作です。

class ForDemo { 
    public static void main(String[] args){ 
      for(int i=1; i<11; i++){ 
       System.out.println("Count is: " + i); 
      } 
    } 
} 

コードが初期化 式の中で 変数を宣言してどのように注意してください。この変数 のスコープは、その宣言から、 ステートメントのブロックの末尾にある まで拡張されているため、 終了式およびインクリメント式 でも使用できます。 for文を制御する変数がループの 外で必要ない場合は、 変数を初期化の中で宣言することがベストです 式。名前i、j、およびkは、ループの制御によく使われる です。 初期化式 内でそれらを宣言すると、寿命が に制限され、エラーが減少します。

出典:http://download.oracle.com/javase/tutorial/java/nutsandbolts/for.html