マイナー・マイナー

隠れた名作の発掘が生きがい。

Javaで無名クラスを利用する際に注意すること


スポンサードリンク

無名クラスは,特定のスーパークラス,インタフェースを継承,実装して使用します.その際にメソッドのオーバーロードやオーバーライドができるのですが,無名クラスのインスタンスを参照型変数に代入して使用する場合,オーバーロードしたメソッドは使用できないそうです.


次に実装例を示します.無名クラスはextends,implementsキーワードを記述することなしに継承,実装ができます.

class ShowSuper {

	void show() {
		System.out.println("Super");
	}
}

public class InnerClassTest {

	public static void main(String[] args) {

		//(A) ShowSuperクラスのshow()メソッドをそのまま使用
		//(A-1) インスタンスを生成してすぐ使用
		new ShowSuper(){}.show();

		//(A-2) 生成したインスタンスを参照変数に代入して使用
		ShowSuper showSuperA = new ShowSuper() {};
		showSuperA.show();

		//(B) ShowSuperクラスのshow()メソッドをオーバーライドして使用
		//(B-1) インスタンスを生成してすぐ使用
		new ShowSuper(){
			void show() {
				System.out.println("Override");
			}
		}.show();

		//(B-2) 生成したインスタンスを参照変数に代入して使用
		ShowSuper showSuperB = new ShowSuper() {
			void show() {
				System.out.println("Override");
			}
		};
		showSuperB.show();

		//(C) ShowSuperクラスのshow()メソッドをオーバーロードして使用
		//(C-1) インスタンスを生成してすぐ使用
		new ShowSuper() {
			void show(String overload) {
				System.out.println(overload);
			}
		}.show("Overload");

		//(C-2) 生成したインスタンスを参照変数に代入して使用
		ShowSuper showSuperC = new ShowSuper() {
			void show(String overload){
				System.out.println(overload);
			}
		};
		//showSuperC.show("Overload");  //エラー
	}

}


実行結果


Super
Super
Override
Override
Overload

(C-2)でエラーが発生するのは,引数が1つのshowメソッドがShowSuperクラスに定義されていないためです.無名クラスのインスタンスを参照型変数に代入して使用する場合は,メソッドが定義されているかどうかを調べてから利用する必要があります.