変数のスコープ
プログラムの中で変数を宣言する位置によって、使用できるかできないかが決まります。つまり、変数には有効範囲があります。これを変数のスコープと呼びます。次のような種類があります。
■ ブロックスコープ
ブロックスコープは、有効範囲がブロック内に限定されます。ブロックとは次の章で学習する制御構文のような開始と終了がある単位です。
次のプログラム例は、if文の中に宣言した変数を、if文の外で表示するために利用しようとしています。しかし、コンパイルエラーとなります。ブロック内で宣言した変数はブロック内で使用できます。
- class BlockScope{
- public static void main(String[] args){
- int num = 1;
- if(num == 1){
- //変数の宣言
- String value;
- //変数に代入
- value = "ブロックスコープの変数";
- }
- //値を表示
- System.out.println(value);
- }
- }
○ コンパイル
C:¥work>javac BlockScope.java
BlockScope.java:13: エラー: シンボルを見つけられません
System.out.println(value);
^
シンボル: 変数 value
場所: クラス BlockScope
エラー1個
C:¥work>
○ 解説
6行目では、String型の変数valueを宣言しています。9行目では、変数valueに値を代入して利用しています。13行目で、変数valueに格納されている値を表示しようとしていますが、コンパイル結果を見てみると「シンボルを見つけられません」とエラーメッセージが表示されます。つまり、変数valueが見つからないと判断されています。ブロックスコープは次の図の囲みで示している範囲で使用できます。
■ メソッドスコープ
メソッドスコープは、有効範囲がメソッド内に限定されます。メソッドとは「static void main(String[] args){~}」で指定された単位です。ローカル変数と呼ばれます。
次のプログラム例は、「main」メソッドの中に宣言した変数を、「test」メソッドで表示するために利用しようとしています。しかし、コンパイルエラーとなります。メソッド内で宣言した変数はメソッド内で使用できます。
- class MethodScope{
- public static void main(String[] args){
- //変数の宣言をする
- String value;
- //変数に代入する
- value = "メソッドスコープの変数";
- }
- public static void test(){
- //値を表示する
- System.out.println(value);
- }
- }
○ コンパイルと実行
C:¥work>javac MethodScope.java
MethodScope.java:12: エラー: シンボルを見つけられません
System.out.println(value);
^
シンボル: 変数 value
場所: クラス MethodScope
エラー1個
C:¥work>
○ 解説
4行目では、String型の変数valueを宣言しています。7行目では、変数valueに値を代入して利用しています。12行目で、変数valueに格納されている値を表示しようとしていますが、コンパイル結果を見てみると「シンボルを見つけられません」とエラーメッセージが表示されます。つまり、変数valueが見つからないと判断されています。メソッドスコープは次の図の囲みで示している範囲で使用できます。
■ クラススコープ
クラススコープは、有効範囲がクラス・構造体内に限定されます。クラスとは「class ClassScope{~}」で指定された単位です。
次のプログラム例は、「ClassScope」クラスの中に宣言した変数を、「test」メソッドで表示するために利用しようとしています。クラスの範囲内であれば使用できるので、コンパイルエラーにはなりません。
- class ClassScope{
- //変数の宣言をする
- static String value;
- public static void main(String[] args){
- //変数に代入する
- value = "メソッドスコープの変数";
- //testメソッドを呼び出す
- test();
- }
- public static void test(){
- //値を表示する
- System.out.println(value);
- }
- }
○ コンパイルと実行
C:¥work>javac ClassScope.java
C:¥work>java ClassScope
メソッドスコープの変数
C:¥work>
○ 解説
3行目では、String型の変数valueを宣言しています。7行目では、変数valueに値を代入して利用しています。15行目で、変数valueに格納されている値を表示しようとしています。今回はコンパイル結果を見てみるとエラーは表示されず、クラスファイルが作成され、実行できます。後の章で学習しますが、10行目でtestメソッドを呼び出しているので、変数valueに格納されている値が表示されます。クラススコープは次の図の囲みで示している範囲で使用できます。