Java の基本 -- 内部クラス

Javaでは、クラスの中にクラスを定義することができ、このようなクラスを内部クラス、内部クラスが配置されるクラスを外部クラスと呼びます。実際の開発では、内部クラスの位置、修飾子、定義方法により、内部クラスはメンバ内部クラス、ローカル内部クラス、静的内部クラス、匿名内部クラスの4種類に分類されます。

メンバー内部クラス (メンバー内部クラス):

  1. 外部クラスのメンバー位置で定義され、外部クラスのインスタンスに関連付けられ、静的な変更を行わずに内部クラスが定義されます
  2. プライベート メンバーを含む外部クラスのすべてのメンバーには直接アクセスでき、外部クラス オブジェクトを通じてインスタンスを作成できます。
  3. 使用構文:外部クラス名.内部クラス名 変数名= 新しい外部クラス名(). 新しい内部クラス名();

ローカル内部クラス (ローカル内部クラス):

  1. メソッドまたはコード ブロック内で定義されると、アクションの範囲は、それが配置されているメソッドまたはコード ブロックに制限されます。
  2. アクセス修飾子を持つことはできず、アクセス修飾子が定義されているメソッドまたはコード ブロック内でのみ使用できます。
  3. メソッドまたはコード ブロック内のローカル変数にアクセスできます (最終的または事実上最終的である必要があります)。
  4. 使用構文:クラス内部クラス名 { ... }

静的内部クラス (静的内部クラス):

  1. 外部クラスで定義され、 static で装飾された内部クラスです
  2. 外部クラスのインスタンスとは関係がなく、外部クラス名を通じて直接アクセスできます 内部クラス名。
  3. 外部クラスの静的メンバーに直接アクセスしてインスタンスを作成することのみが可能で、非静的メンバーにはアクセスできません。
  4. 使用構文:外部クラス名.静的内部クラス名 変数名= 新しい外部クラス名().静的内部クラス名();

匿名内部クラス (匿名内部クラス):

  1. 明示的な定義はなく、インターフェイスまたは抽象クラスをインスタンス化することによって直接作成されます。
  2. 名前を付ける必要はなく、コードの作成を簡素化するためにメソッドを一時的にオーバーライドする必要がある場合に通常使用されます
  3. インターフェイスの実装クラス、または抽象クラスから継承されたサブクラスにすることができます。
  4. 使用構文:新しいインターフェース名/抽象クラス名() { //匿名の内部クラス実装部分}

次の例は、さまざまなタイプの内部クラスの使用を示しています。

public class OuterClass {
    private int outerVariable = 10;
    private static int outerStaticVariable = 20;

    // 成员内部类
    public class MemberInnerClass {
        public void display() {
            System.out.println("成员内部类:" + outerVariable);
        }
    }

    // 静态内部类
    public static class StaticInnerClass {
        public void display() {
            System.out.println("静态内部类:" + outerStaticVariable);
        }
    }

    // 方法示例
    public void displayLocalInnerClass() {
        int localVariable = 30; // 局部变量

        // 局部内部类
        class LocalInnerClass {
            public void display() {
                System.out.println("局部内部类:" + localVariable);
            }
        }

        LocalInnerClass localInnerObj = new LocalInnerClass();
        localInnerObj.display();
    }

    // 匿名内部类示例
    public void displayAnonymousInnerClass() {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("匿名内部类");
            }
        };

        Thread thread = new Thread(runnable);
        thread.start();
    }

    public static void main(String[] args) {
        OuterClass outerObj = new OuterClass();

        // 使用成员内部类
        OuterClass.MemberInnerClass memberInnerObj = outerObj.new MemberInnerClass();
        memberInnerObj.display();//运行:成员内部类:10

        // 使用静态内部类
        OuterClass.StaticInnerClass staticInnerObj = new OuterClass.StaticInnerClass();
        staticInnerObj.display();//静态内部类:20

        // 调用局部内部类示例方法
        outerObj.displayLocalInnerClass();//局部内部类:30

        // 调用匿名内部类示例方法
        outerObj.displayAnonymousInnerClass();//匿名内部类
    }
}

この例では、4 つの異なるタイプの内部クラスの使用を示します。

  1. メンバ内部クラス (Member Inner Class): 外部クラス インスタンスを通じて内部クラス インスタンスを作成し、外部クラス インスタンスのメンバ変数にアクセスできるようにします。

  2. 静的内部クラス (静的内部クラス): 外部クラスの名前を使用して内部クラスに直接アクセスします。外部クラスのインスタンスとは関係がなく、外部クラスの静的メンバーのみにアクセスできます。

  3. ローカル内部クラス (ローカル内部クラス): メソッド内で定義された内部クラスはメソッド内でのみ表示され、メソッドのローカル変数にアクセスできますが、ローカル変数は Final または実質的に Final である必要があります。

  4. 匿名内部クラス (匿名内部クラス): インターフェイスまたは抽象クラスをインスタンス化することによって作成され、明示的な定義はありません。多くの場合、1 回限りの必須メソッドをオーバーライドするために使用されます。この例では、Runnable インターフェイスが匿名の内部クラスを通じて実装され、スレッドが作成されます。

おすすめ

転載: blog.csdn.net/m0_74293254/article/details/132320498