>> Java入門トップに戻る

無名クラス(匿名クラス)

Javaの無名クラスについて説明します。

無名クラスとは一時的に利用するために作られる名前の無いクラスのことです。
言葉では説明するのが難しいので、早速コードを見てください。
package test5;

public class Mumei {
	
	public static void main(String[] args){
		//無名クラス
		Test obj = new Test(){
			@Override
			public void echoHello() {
				System.out.println(value);
			}
		//セミコロンがいる
		};
		
		obj.echoHello();
		
	}
}

interface Test{
	int value=10;
	void echoHello();
}
7行目に注目してください。
インターフェイスTestをnewする所で、さらに括弧でブロックが続いてます。
そのブロック内でクラスのようにechoHelloメソッドをオーバーライドしています。
実はこのブロック内に書かれているものが「無名クラス」なんです。
頭の良い人はインターフェイスってインスタンスは作成出来ないはずじゃ・・って思ってるかもしれませんが、これは「インターフェイスのインスタンスではなく、インターフェイスを実装した新しいクラスのインスタンスを生成」しているんです。

インターフェイスを実装してクラスを作るにはimplementsを使ってましたが、それを省略して書いたようなものです。
変数objにはこの無名クラスのインスタンスが入ってますので、15行目のechoHelloメソッドが実行されると、9行目でオーバーライドした通りに「10」が出力されます。

また、インターフェイス以外の通常のクラスからでも無名クラスは作成できます。
通常のクラスをnewして無名クラスを作成した場合は「newしたクラスを継承して新しいクラスを作成」することになります。
ですので、基のクラス(親クラス)のフィールドやメソッドについているアクセス修飾子がprivateだと、無名クラス内ではそれらにアクセスできなくなってしまうので注意してください。

注意事項として、上記のコードのように無名クラスを定義してそのインスタンスを変数に代入するような時は「new クラス名(){};」と一番最後に「セミコロンが必要」なことを忘れないで下さい。
ただし、以下のように無名クラスをメソッドの引数で作成する場合はセミコロンは不要です。
		obj.setObject(new Test(){
			@Override
			public void echoHello() {
				System.out.println(value);
			}
		});

この無名クラスは「Swing」と呼ばれるGUIベースのプログラムを作成する時によく使いますので覚えておいて下さい。

>> 【例外処理 try catch finally】に進む
>> Java入門トップに戻る