Javaラーニングロード-内部クラス

Javaラーニングロード-内部クラス

概要概要

Javaでは、クラスは別のクラスまたはメソッドで定義できます。このようなクラスは内部クラスと呼ばれます。

広い意味での内部クラスには、一般に、メンバー内部クラス、ローカル内部クラス、匿名内部クラス、および静的内部クラスの4つのタイプが含まれます。

1つは、メンバーの内部クラスです。

クラスAでクラスBを定義すると、クラスAは外部クラスと呼ばれ、クラスBはメンバー内部クラスと呼ばれます。

メンバー内部クラスは、外部クラスのすべてのメンバー属性とメンバーメソッド(プライベートメンバーと静的メンバーを含む)に無条件でアクセスできますが、外部クラスがメンバー内部クラスのメンバーにアクセスする場合は、最初にメンバー内部のオブジェクトを作成する必要がありますクラスをクリックし、このオブジェクトをポイントして、内部クラスのプロパティにアクセスします。

public class Demo {
    
    
    public static void main(String[] args)  {
    
    
        A a1 = new A();
        a1.testA();
    }
}

class A {
    
    
    private int x = 0;
    
    // 内部类B
    class B {
    
    
        int y=1;
        
        // 访问外部类的属性
        public void testB() {
    
    
            System.out.println(x);
        }
    }

    public void testA() {
    
    
        B b1 = new B();
        b1.testB();
        // 访问内部类的属性
        System.out.println(b1.y);
    }
}

メンバー内部クラスに外部クラスと同じ名前のメンバー変数またはメソッドがある場合、非表示の現象が発生します。つまり、メンバー内部クラスのメンバーはデフォルトでアクセスされます。外部クラスと同じ名前のメンバーにアクセスする場合は、次の形式でアクセスする必要があります。

外部类.this.成员变量
外部类.this.成员方法

public class Demo {
    
    
    public static void main(String[] args)  {
    
    
        A a1 = new A();
        a1.testA();
    }
}

class A {
    
    
    String name = "外部类";

    // 内部类B
    class B {
    
    
        String name = "内部类";

        // 访问外部类的属性
        public void test() {
    
    
            System.out.println(name);
            System.out.println(A.this.name);
        }
    }

    void testA() {
    
    
        B b1 = new B();
        b1.test();
    }
}

メンバー内部クラスは外部クラスに依存しています。つまり、メンバー内部クラスのオブジェクトを作成する場合は、外部クラスのオブジェクトが存在する必要があるという前提があります。

public class Demo {
    
    
    public static void main(String[] args)  {
    
    
        // 初始化一个 A 对象
        A a1 = new A();

        // 方式1
        A.B b1 = a1.new B();

        // 方式2
        A.B b2 = a1.getBInstance();
    }
}

class A {
    
    
    private B b = null;

    public B getBInstance() {
    
    
        if(b == null)
            b = new B();
        return b;
    }

    // 内部类B
    class B {
    
    
        String name = "内部类";
    }
}

2、ローカル内部クラス

ローカル内部クラスは、メソッドまたはスコープで定義されたクラスです。ローカル内部クラスへのアクセスは、メソッドまたはスコープに制限されています。

ローカル内部クラスはローカル変数に似ており、public、protected、private、およびstatic修飾子を持つことはできません。

public class Demo {
    
    
    public static void main(String[] args)  {
    
    
        class A {
    
    
            String name = "局部内部类";
        }

        A a1 = new A();
        System.out.println(a1.name);
    }
}

3つの匿名の内部クラス

クラスが抽象またはインターフェイスである限り、そのサブクラスのメソッドは匿名の内部クラスを使用して実装できます。

匿名の内部クラスは、コンストラクターのない唯一のクラスです。コンストラクターがないため、匿名内部クラスの使用範囲が制限されます。一般的に、匿名内部クラスは、他のクラスを継承したり、インターフェイスを実装したりするために使用されます。

public class Demo {
    
    
    public static void main(String[] args) {
    
    
        Person p = new Person() {
    
    
            public void run() {
    
    
                System.out.println("Eating");
            }
        };
        p.run();
    }
}

abstract class Person {
    
    
    public abstract void run();
}

4つの静的内部クラス

静的内部クラスは、別のクラスで定義されたクラスでもあります。このクラスは静的クラスであり、呼び出しを行うために外部クラスのインスタンス化に依存する必要はありません。

public class Demo {
    
    
    public static void main(String[] args)  {
    
    
        A.B b1 = new A.B();
        b1.testB();
    }
}

class A {
    
    
    // 内部类B
    static class B {
    
    
        String name = "静态内部类";

        // 访问外部类的属性
        public void testB() {
    
    
            System.out.println(name);
        }
    }
}

おすすめ

転載: blog.csdn.net/qq_43580193/article/details/112642106