Java の匿名内部クラス
Java の匿名内部クラス
次の場面では、クラスに名前をつけること無くクラスを定義してインスタンスを生成する事が可能です。
- あるクラスの派生クラスのオブジェクトを一つだけインスタンス化する場合
- あるインターフェイスを実装して一つだけインスタンスを作成する場合
名前を付けずにクラスを定義するので、このようなクラスを匿名内部クラス (Anonymous Inner Class) といいます。
匿名内部クラスの書き方は、次のようになります。
new スーパータイプ ( コンストラクタ パラメータ) {
インナークラスのメソッド、データ
}
ここでスーパータイプは、インターフェイスでもクラスでも OK です。クラスを指定すれば、{ から } で括られるところで、派生クラスを定義できますし、 インターフェイスを指定する場合は、そのインターフェイスを実装したクラスを定義できます。
匿名内部クラスは、特にイベント処理時の ActionListener の実装などで用いられます。
匿名内部クラスの実装例
それでは、実例を示します。
まず、以下で利用するクラスとインターフェイスを定義しましょう。
インターフェイス MyInterface1 は次の通り。foo というメソッド一つが定義されています。
public interface MyInterface1 {
void foo();
}
クラス MyClass1 は次の通りです。 bar というメソッド一つ定義されています。そのメソッドの内部では、ORIGINAL... という文字が出力されます。
public class MyClass1 {
public void bar(){
System.out.println("ORIGINAL: I'm bar();");
}
}
さて、それぞれのインターフェイス MyInterface1 とクラス MyClass1 をそれぞれ、実装、派生するクラスを匿名内部クラスを利用して定義してオブジェクトを作りましょう。
public class TestApp {
public static void main(String[] args) {
MyInterface1 mi = new MyInterface1() {
public void foo() {
System.out.println("Hello, anon class!");
}
};
MyClass1 mc = new MyClass1() {
public void bar() {
super.bar();
System.out.println("ANON: Hello, bar()!");
}
};
mi.foo();
mc.bar();
}
}
この実行結果は次の通りです。
Hello, anon class!
ORIGINAL: I'm bar();
ANON: Hello, bar()!
mi, mc それぞれの変数にて、foo メソッド、bar メソッドを呼び出しています。 確かにそれぞれのメソッドが呼び出され、結果が表示されたことが分かります。