はじめに
皆さん。こんにちは!
DreamHanksの254cmです。
今回は変数のスコープについて説明していきます。
Java記事のまとめはこちらです。
前回の記事は【Java開発】第12回 finalです。
変数のスコープ
変数のスコープは変数の有効範囲を意味するものです。
変数をどこまで参照できるのか、名前が重複されてもいいかがスコープによって決定されます。
スコープは「{}」の括弧で見分けられます。
変数は自分の宣言が含まれている括弧とその括弧で含まれている括弧で使われます。
ローカル変数のスコープ
ローカル変数はメソッドの括弧の中に宣言された変数を意味します。
ローカル変数は宣言される時にStack領域に生成され、括弧が終わるときに削除されます。
サンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class ScopeSample { public static void main(String[] args) { int a = 10; if(a == 10) { int b = a; System.out.println(b); } System.out.println(b); } } |
上記のソースコードを作成してみるとbを使うところが二つあります。
ifの中の処理は問題ありませんが、外の処理はコンパイルエラーが表示されています。
変数bはifの括弧に生成され、括弧が終わるときに削除されます。
ifの外ではもうすでにbがなくなった後なので、bが使われるとコンパイルエラーが表示されます。
サンプル2
1 2 3 4 5 6 7 8 9 10 11 |
public class ScopeSample { public static void main(String[] args) { int a = 10; if(a == 10) { int b = a; System.out.println(b); int a = 5; } } } |
上記のサンプルにはifの中にまたaを宣言しています。
変数は自分が含まれている括弧より下位の括弧にも使えます。
なので、ifの中にaをまた宣言すると上位の変数aと衝突されます。
サンプル3
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class ScopeSample { public static void main(String[] args) { int a = 10; System.out.println(c); } static void display() { int c; System.out.println(a); } } |
上記のサンプルの変数aとcは別のメソッドで宣言されています。
つまり、含まれている括弧が異なって、使えません。
クラスのフィールドの有効範囲
クラスのフィールドはローカル変数と異なり、メソッドの中で同じ名前の変数が宣言されていても、衝突が起きません。
変数を参照するとき、同じ名前のローカル変数が存在する場合にはローカル変数の方が参照され、
同じ名前のローカル変数が存在されない場合にはフィールドの方が参照されます。
※フィールド変数はstatic修飾子が付与されていなかった場合、staticメソッドの中には参照できまん。
サンプル
1 2 3 4 5 6 7 8 |
public class ScopeSample { int a = 10; public void display() { int a = 5; System.out.println(a); } } |
上記のサンプルのクラスはフィールド変数aとdisplayメソッドで宣言したローカル変数aを持っています。
二つのaは名前が同じですが、フィールド変数とローカル変数なので衝突されません。
上記のサンプルクラスのインスタンスを生成してdisplayメソッドを実行すると
1 2 3 4 5 6 |
public class ExampleCalss { public static void main(String[] args) { ScopeSample scopeSample = new ScopeSample(); scopeSample.display(); } } |
ローカル変数aの値5が出力されます。
終わりに
今回の記事は以上になります。
次回はJavaのアクセス制御を学びましょう。
ご覧いただきありがとうございます。
コメント