inner classを使う
inner classはクラスの中に定義されたクラスです。
限られたクラスからしか、利用されない(外側のクラスと密に結びついた)クラスを記述する目的に使われ、
GUIのイベントを処理する際によく使われます。
メンバ変数やメソッドと同じく、外側クラスのメンバとして記述されるメンバーインナークラスと
メソッドのコードブロックの中に記述される、ローカルインナークラスがあります。
ローカルインナークラスにはクラス名を持たない、匿名インナークラスを作る事が可能です。
下のサンプルコードは3つの数値を計算するプログラムで、コンストラクタに与えられた数値を2倍し、5を引いています。(bi1
* i9 - i9)
メンバーインナークラスのサンプルです。
class ExamInnerBase {
int bi1;
@
int i9 = 5;
A
ExamInnerBase(int i1) {
bi1 = i1;
}
class InnerMenber {
int i9 = 2;
int mi1 = bi1 * i9 - ExamInnerBase.this.i9; //InnerMenber -> InnerBase
@ A
}
}
public class ExamInner {
public static void main(String args[]) {
ExamInnerBase eib = new ExamInnerBase(100);
ExamInnerBase.InnerMenber im = eib.new InnerMenber();
B
System.out.println(im.mi1);
System.out.println( new ExamInnerBase(10).new InnerMenber().mi1);
B
}
}
<実行結果>
コンソール画面に
195
15
と表示されます。
| @ 変数 bi1 | 変数bi1は外側クラスのメンバー変数です。インナークラスは外側クラスのメンバ変数を利用出来ますし、 外側クラスのメソッドも利用可能です。 |
| A 変数 i9 | 変数i9は外側クラスのメンバー変数とインナークラスにも同名の変数があります。その場合、インナークラスから 外側クラスの変数を指定するために、クラス名.this.変数名と記述します。 インナークラスでDialog-boxを表示する時に、外側のクラスへの参照を渡したい時などに使う事があります。 (外側クラスがFrameクラスのサブクラスの場合など。) |
| Bインスタンス化 | インスタンスを2つ作成しています。1つは外側クラスのインスタンスを作成し、その参照からインナークラスを インスタンス化、もう1つはインスタンスへの参照名を付けずにインスタンス化しています。 |