ブロック内でのみ有効
ブロック内で宣言された変数はそのブロック内でのみ有効で、ブロックを出るときに破棄される。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class BlockScope { public void blockScope1() { { String s = "in the first block"; System.out.println(s); } { String s = "in the second block"; System.out.println(s); } } public static void main(String[] args) { BlockScope app = new BlockScope(); app.blockScope1(); } } // in the first block // in the second block |
ブロック内で宣言された変数は、ブロック外では存在していない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class BlockScope { public void blockScope2() { { String s = "in the first block"; System.out.println(s); } { String s = "in the second block"; System.out.println(s); } System.out.println(s); // コンパイルエラー:s を変数に解決できません } } |
ブロック外で宣言可能
ブロック内スコープの変数はブロック外では存在しないので、ブロック外で同じ名前で宣言できる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public class BlockScope { public void blockScope3() { { String s = "in the first block"; // コンパイルエラー:重複ローカル変数 s System.out.println(s); } { String s = "in the second block"; // コンパイルエラー:重複ローカル変数 s System.out.println(s); } String s = "out of scope"; System.out.println(s); } public static void main(String[] args) { BlockScope app = new BlockScope(); app.blockScope3(); } } // in the first block // in the second block // out of scope |
ブロック外宣言はブロック内で有効
ブロックの前で宣言された変数は、その後のブロック内で使用可能。以下の例では、ブロックの前で宣言された変数s
がその後のブロックの中で書き換えられている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public class BlockScope { public void blockScope4() { String s = "out of scope"; { s = "in the first block"; System.out.println(s); } { s = "in the second block"; System.out.println(s); } System.out.println(s); } public static void main(String[] args) { BlockScope app = new BlockScope(); app.blockScope4(); } } // in the first block // in the second block // in the second block |
したがって、ブロックの前で宣言された変数をブロック内ローカル変数として定義することはできない。定義しようとすると重複定義エラーになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class BlockScope { public void blockScope5() { String s = "out of scope"; { String s = "in the first block"; // コンパイルエラー:重複ローカル変数 s System.out.println(s); } { String s = "in the second block"; // コンパイルエラー:重複ローカル変数 s System.out.println(s); } } } |