Javaの内部クラスについてのガイド


  1. ネストクラス: ネストクラスは、外部クラスのインスタンスと関連付けられるクラスです。ネストクラスは、外部クラスのメンバとして宣言され、外部クラスのメンバに直接アクセスできます。ネストクラスはstaticまたは非staticであることができます。staticなネストクラスは、外部クラスのインスタンスに依存しないため、外部クラスのインスタンスを作成せずに直接インスタンス化することができます。

  2. メンバクラス: メンバクラスは、外部クラスのメンバとして宣言される内部クラスです。メンバクラスは、外部クラスのインスタンスメンバと同じようにアクセス修飾子を持つことができます。メンバクラスは、外部クラスのインスタンスを使用してインスタンス化する必要があります。

  3. ローカルクラス: ローカルクラスは、メソッド内またはスコープ内で定義される内部クラスです。ローカルクラスは、その定義されたブロック内でのみ有効です。ローカルクラスは、外部クラスのメンバにアクセスすることができますが、外部クラスのインスタンスを使用してインスタンス化する必要があります。

  4. 匿名クラス: 匿名クラスは、名前のないクラスであり、インターフェースや抽象クラスを直接実装または拡張するために使用されます。匿名クラスは、一度だけ使用されるクラスであり、通常はインターフェースの実装やイベントハンドラの定義に便利です。

これらの内部クラスは、Javaの柔軟性と再利用性を向上させるための強力なツールです。コード例を使用して、それぞれの内部クラスの使い方を示します。

ネストクラスの例:

public class OuterClass {
    private int outerField;
    public class InnerClass {
        public void innerMethod() {
            outerField = 10;
            System.out.println("Inner method called");
        }
    }
}

メンバクラスの例:

public class OuterClass {
    private int outerField;
    public void outerMethod() {
        InnerClass inner = new InnerClass();
        inner.innerMethod();
    }
    public class InnerClass {
        public void innerMethod() {
            outerField = 10;
            System.out.println("Inner method called");
        }
    }
}

ローカルクラスの例:

public class OuterClass {
    private int outerField;
    public void outerMethod() {
        class LocalClass {
            public void localMethod() {
                outerField = 10;
                System.out.println("Local method called");
            }
        }
        LocalClass local = new LocalClass();
        local.localMethod();
    }
}
匿名クラスの例:

public interface MyInterface { void doSomething(); }

public class OuterClass { public void run() { MyInterface anonymous = new MyInterface() { @Override public void doSomething() { System.out.println("Anonymous class implementation"); } }; anonymous.doSomething(); } }