Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaの匿名内部クラスとは?3つの種類と実装例をわかりやすく解説

匿名内部クラス(Anonymous Inner Class)とは、クラス名を持たない内部クラスのことです。名前がないため、コンストラクタを定義することはできません。これは、コンストラクタの名前がクラス名と同じでなければならないというJavaのルールによるものです。

匿名内部クラスは、new演算子を使ってクラスの宣言とオブジェクトの生成を同時に、1ステップで行えるのが大きな特徴です。一時的な処理や短い実装に適しており、コードを簡潔に保つことができます。

基本構文

new(引数リスト){
    // 匿名クラスの本体
}

匿名内部クラスの3つの種類

Javaにおける匿名内部クラスは、主に以下の3つのパターンに分類されます。

  • クラスを継承する匿名内部クラス
  • インターフェースを実装する匿名内部クラス
  • 引数として渡される匿名内部クラス

1. クラスを継承する匿名内部クラス

このパターンでは、newキーワードを使って匿名内部クラスのオブジェクトを生成し、その参照を親クラス型の変数に代入します。

コード例

class Car {
    public void engineType() {
        System.out.println("Turbo Engine");
    }
}
public class AnonymousClassDemo {
    public static void main(String args[]) {
        Car c1 = new Car();
        c1.engineType();
        Car c2 = new Car() {
            @Override
            public void engineType() {
                System.out.println("V2 Engine");
            }
        };
        c2.engineType();
    }
}

実行結果

Turbo Engine
V2 Engine

この例では、c1は通常のCarクラスのインスタンスであるため「Turbo Engine」が出力されますが、c2はengineTypeメソッドをオーバーライドした匿名クラスのインスタンスのため「V2 Engine」が出力されます。

2. インターフェースを実装する匿名内部クラス

このパターンでは、newキーワードを使って匿名内部クラスのオブジェクトを生成し、その参照をインターフェース型の変数に代入します。

コード例

interface Software {
    public void develop();
}
public class AnonymousClassDemo1 {
    public static void main(String args[]) {
        Software s = new Software() {
            @Override
            public void develop() {
                System.out.println("Software Developed in Java");
            }
        };
        s.develop();
        System.out.println(s.getClass().getName());
    }
}

実行結果

Software Developed in Java
AnonymousClassDemo1$1

getClass().getName()の出力にある「$1」は、コンパイラが自動的に割り当てた匿名クラスの内部的な名前です。これにより、名前を持たないクラスでもJVM上では識別可能になっていることがわかります。

3. 引数として渡される匿名内部クラス

匿名内部クラスは、メソッドやコンストラクタの引数として直接渡すこともできます。この書き方により、一時的な実装をその場で定義でき、コードがさらに簡潔になります。

コード例

abstract class Engine {
    public abstract void engineType();
}
class Vehicle {
    public void transport(Engine e) {
        e.engineType();
    }
}
public class AnonymousInnerClassDemo2 {
    public static void main(String args[]) {
        Vehicle v = new Vehicle();
        v.transport(new Engine() {
            @Override
            public void engineType() {
                System.out.println("Turbo Engine");
            }
        });
    }
}

実行結果

Turbo Engine

まとめ

匿名内部クラスには「クラスの継承」「インターフェースの実装」「引数としての利用」という3つの使い方があります。いずれも名前を持たないクラスをその場で定義・インスタンス化できるため、イベントリスナーのコールバック処理など、一度だけ使う実装に特に便利です。なお、Java 8以降はラムダ式でも同様の記述をより簡潔に行えますが、複数の抽象メソッドを持つインターフェースや抽象クラスを扱う場合には、依然として匿名内部クラスが有効な選択肢となります。

  1. JavaのJListで使える選択モードは何種類?3つのモードの違いを解説

    JListは、JComponentクラスを継承したSwingコンポーネントの一つで、オブジェクトのリストを画面に表示し、ユーザーがその中から1つ以上の項目を選択できるようにするためのものです。 JavaのJListには、用途に応じて使い分けられる3種類の選択モードが用意されています。 ListSelectionModel.SINGLE_SELECTION:一度に選択できるのは、リスト内の1つのインデックスだけです。 ListSelectionModel.SINGLE_INTERVAL_SELECTION:一度に選択できるのは、1つの連続した区間(連続するインデックスの範囲)だけです。 Lis

  2. Javaで作成できるJDialogボックスは2種類!モーダルと非モーダルの違いを解説

    JDialogはDialogクラスのサブクラスで構されるSwingのダイアログコンポーネントです。一般的なフレームウィンドウと異なり、ウィンドウ右上に最小化・最大化ボタンが表示されません。Javaでは、このJDialogボックスを用途に応じて2種類作成できます。 モーダルダイアログ(Modal Dialog) 非モーダルダイアログ(Non-Modal Dialog) モーダルJDialog(Modal JDialog) Javaにおいて、モーダルダイアログがアクティブになっている間、すべてのユーザー入力はそのダイアログに向けられます。このダイアログを閉じるまで、アプリケーションの他の部分に