#ローカルクラス
ローカルクラスとは、あるクラスのメソッド内に定義したクラスのこと。
##ルール
アクセス修飾子使用不可(private, protected,public)
static修飾子使用不可
abstract, final修飾子は使用可
外側クラスのメンバにアクセス可
※ローカルクラスから外側クラスのメソッドの引数およびローカル変数にアクセスする際には各変数が定数(final修飾子付き)でなければならない。(ただし、SE8からはローカルクラスからよびだされた時点でfinal修飾子が暗黙的に付与される。)
以下のコードで外側クラスのメソッドの引数、ローカル変数が定数でないとアクセスできない様子、自動的に定数にされている様子が確認できる。
また、外側クラスのインスタンス変数は定数でなくてもローカルクラスからアクセスできていることがわかる。
class OuterA{ //外側クラス
private static int a = 1;
private int b =2;
void methodOuter(final int c, int d) {
final int e =5; int f =6;
//c=10; //cはfinalがついているから定数。再代入不可。
//d=10; //この時点では、定数ではないから代入できる。
//しかし、これをするとdが変数であることが確定するので、ローカルクラスからの呼び出しができなくなる
//d++; //変数宣言時点でfinalがつくので、この変更をするとローカルクラスから呼べなくなる
//f++;
class A{ //ローカルクラス
void method() {
System.out.print(a+" ");
System.out.print(b+" ");
System.out.print(c+" ");
System.out.print(d+" ");
System.out.print(e+" ");
System.out.print(f+" \n"); //「\n」は改行
a++;
b++;
//c++;
//d++;
//e++;
//f++;
//c,d,e,fは定数になっているが、a,bは定数じゃない
System.out.print(a+" "+b);
}
}
new A().method();
}
}
public class Test3 {
public static void main(String[] args) {
OuterA o = new OuterA();
o.methodOuter(3,4);
}
}
###出力結果
1 2 3 4 5 6
2 3
###ポイント
①インスタンス変数は定数でなくてもローカルクラスから呼び出すことができる。
②メソッドの引数とローカル変数をローカルクラスから呼び出すときは定数(final修飾子付き)でなくてはいけない。(付いていないときは暗黙的に付与される)
③暗黙的にfinal修飾子が付与されるときは、変数の宣言時点で行われるので、その変数をローカルクラスから呼び出すときは、ローカルクラスから変数を呼び出す(ローカルクラスで変数を使用する)以前であっても値の再代入してはいけない。
④変数宣言後に値を変更(代入やインクリメントなど)をした時点で変数であることが確定し、ローカルクラスからの呼び出しはできなくなる。
##参考文献
山本道子『Javaプログラマ Gold SE8』翔泳社.