publicstaticvoidmain(String.. args){ { // ブロックで囲むとスコープが定義される int i = 0; System.out.println(i); //スコープ内ならコンパイルは通る } int i = 1; // スコープ外で同名の変数を定義するのはOK }
逆に、最初に変数を宣言した場合はスコープが重複する(シャドーイング)ためコンパルエラーとなります。
publicstaticvoidmain(String... args){ int i = 0; { int i = 0; // 上のiが有効なため、コンパイルエラー } }
フィールド変数の場合は重複してもエラーにはなりません。ローカル変数が優先されます。
classMain{ int i = 0; // フィールド変数 voiddoSomething(){ int i = 1; // ローカル変数 System.out.println(i); // ローカル変数が優先され、1を表示 System.out.println(this.i); // フィールド変数を使う場合はthisをつける。0が表示 } }