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が表示 } }