class Test{
public static void main(String args[]){
int i; // これがローカル変数
}
}
|
メンバー変数では初期値が設定されていましたが、ローカル変数では初期値がありません。CやC++では、
不確定な値が代入されていますが、Javaでは不確定な値を使用しようとするとコンパイル時にエラーが出ます。
class Test{
public static void main(String args[]){
int i;
// 不確定な変数を使用することはできないのでコンパイルエラー
System.out.println(i);
}
}
|
C:\java>javac Test.java
Test.java:6: Variable i may not have been initialized.
System.out.println(i);
^
1 error
C:\java>
|
ローカル変数は、定義されたブロック内でしか使用することができません。変数を使用できる範囲のことを
スコープと言います。Cではブロックの最初でしか変数を定義できませんでしたが、JavaやC++ではブロックのどこ
でも宣言できます。しかし宣言したブロックを出ると、スコープの範囲外になり、その変数は使用することはできません。
class Test{
public static void main(String args[]){
System.out.println("mainメソッド");
// ブロックの途中でも宣言できる
int i = 0;
for( ; i < 5 ; i++ ){
int j = 0;
// ブロック内であればその中のブロックの中でもしようできる
System.out.println(i);
}
// ローカル変数[j]はスコープを出ているのでコンパイルエラー
System.out.println(j);
}
}
|
C:\java>javac Test.java
Test.java:14: Undefined variable: j
System.out.println(j);
^
1 error
C:\java>
|
また、特例として、for文の初期設定で変数を宣言することができます。この場合、そのfor文(を含むブロック)がスコープになります。
class Test{
public static void main(String args[]){
System.out.println("mainメソッド");
// for文の初期設定でもローカル変数を宣言できる
for( int i = 0 ; i < 5 ; i++ ){
// ローカル変数[i]はfor文(ブロック)でのみ有効だから、ここではOK!
System.out.println(i);
}
// ローカル変数[i]はスコープを出ているのでコンパイルエラー
System.out.println(i);
}
}
|
C:\java>javac Test.java
Test.java:11: Undefined variable: i
System.out.println(i);
^
1 error
C:\java>
|
ローカル変数は、メンバー変数と同じ名前で使用することができる。この場合、ローカル変数のスコープないでは
ローカル変数が使用され、スコープをはずれるとメンバー変数が使用される。つまり、そのスコープ内では、
メンバー変数が隠されることになる。この場合、インスタンス変数の場合は「this」キーワードを、
静的変数の場合は「クラス名.」を使用することで、隠されているメンバー変数にアクセスできる。
class Test{
// 静的変数として[m]を定義
static int m;
public static void main(String args[]){
System.out.println("m=" + m);
{
// 静的変数とし同じ[m]を定義
int m = 10;
System.out.println("m=" + m);
// 静的変数の場合は[クラス名.]を使用する
System.out.println("Test.m=" + Test.m);
}
System.out.println("m=" + m);
}
}
|
class Test{
// インスタンス変数として[m]を定義
int m;
private void hoge(){
System.out.println("m=" + m);
{
m = 1; // this.m = 1 と同じ
// インスタンス変数とし同じ[m]を定義
int m = 10;
System.out.println("m=" + m);
// インスタンス変数の場合は[this.]を使用する
System.out.println("this.m=" + this.m);
}
System .out.println("m=" + m);
}
public static void main(String args[]){
new Test().hoge();
}
}
|
C:\java>javac Test.java
C:\java>java Test
m=0
m=10
Test.m=0
m=0
C:\java>
|
C:\java>javac Test.java
C:\java>java Test
m=0
m=10
this.m=1
m=1
C:\java>
|
class Test{
public static void main(String args[]){
int a = 10;
{
// これはエラー
int a = 10;
}
}
}
|
C:\java>javac Test.java
Test.java:6: Variable 'a' is already defined in this method.
int a = 10;
^
1 error
C:\java>
|