プログラムの中で変数を宣言する位置によって、使用できるかできないかが決まります。つまり、変数には有効範囲があります。これを変数のスコープと呼びます。次のような種類があります。
ブロックスコープは有効範囲がブロック内に限定されます。ブロックとは次の章で学習する制御構文のような開始と終了がある単位です。
次のプログラム例は、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:15: エラー: シンボルを見つけられません
System.out.println(value);
^
シンボル: 変数 value
場所: クラス BlockScope
エラー1個
C:¥work>
メソッドスコープは有効範囲がメソッド内に限定されます。メソッドとは上の図の「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:15: エラー: シンボルを見つけられません
System.out.println(value);
^
シンボル: 変数 value
場所: クラス MethodScope
エラー1個
C:¥work>
クラススコープは有効範囲がクラス・構造体内に限定されます。クラスとは上の図の「class ClassScope{~}」で指定された単位です。
次のプログラム例は、「ClassScope」クラスの中に宣言した変数を、「test」メソッドで表示するために利用しようとしています。クラスの範囲内であれば使用できるので、エラーにはなりません。
class ClassScope{
//変数の宣言
static String value;
public static void main(String[] args){
//変数に代入
value = "メソッドスコープの変数";
}
public static void test(){
//値を表示
System.out.println(value);
}
}
○ コンパイル
C:¥work>javac ClassScope.java
C:¥work>