Clases internas de Java Learning Road

Clases internas de Java Learning Road

Visión general

En Java, una clase se puede definir en otra clase o en un método. Esta clase se denomina clase interna.

Las clases internas en un sentido amplio generalmente incluyen estos cuatro tipos: clases internas de miembros, clases internas locales, clases internas anónimas y clases internas estáticas.

Uno, clase interna miembro

Defina una clase B en la clase A, luego la clase A se llama clase externa y la clase B se llama clase interna miembro.

La clase interna del miembro puede acceder incondicionalmente a todos los atributos y métodos del miembro de la clase externa (incluidos los miembros privados y los miembros estáticos), pero la clase externa desea acceder a los miembros de la clase interna del miembro primero debe crear un objeto del miembro interno. class, y luego apunte a este objeto Para acceder a las propiedades de la clase interna.

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);
    }
}

Cuando la clase interna miembro tiene una variable miembro o método con el mismo nombre que la clase externa, ocurrirá el fenómeno oculto, es decir, se accede a los miembros de la clase interna miembro por defecto. Si desea acceder a un miembro con el mismo nombre de una clase externa, debe acceder a él en el siguiente formulario:

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

Ejemplo

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();
    }
}

La clase interna del miembro depende de la clase externa, es decir, si desea crear un objeto de la clase interna del miembro, la premisa es que debe haber un objeto de la clase externa.

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 = "内部类";
    }
}

Dos, clase interna local

Una clase interna local es una clase definida en un método o alcance. El acceso a las clases internas locales está limitado a métodos o ámbitos.

Las clases internas locales son similares a las variables locales y no pueden tener modificadores públicos, protegidos, privados y estáticos.

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

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

Tres, clase interior anónima

Siempre que una clase sea abstracta o una interfaz, los métodos de sus subclases se pueden implementar utilizando clases internas anónimas.

Una clase interna anónima es la única clase sin un constructor. Debido a que no tiene constructor, el alcance de uso de clases internas anónimas es limitado. En términos generales, las clases internas anónimas se utilizan para heredar otras clases o implementar interfaces.

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();
}

Cuatro, clase interior estática

Una clase interna estática también es una clase definida en otra clase. Esta clase es una clase estática y no necesita depender de la instanciación de una clase externa para realizar llamadas.

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);
        }
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_43580193/article/details/112642106
Recomendado
Clasificación