Aulas internas de aprendizagem em Java

Aulas internas de aprendizagem em Java

Visão geral

Em Java, uma classe pode ser definida em outra classe ou em um método.Tal classe é chamada de classe interna.

Classes internas em um sentido amplo geralmente incluem estes quatro tipos: classes internas de membros, classes internas locais, classes internas anônimas e classes internas estáticas.

Um, membro da classe interna

Defina uma classe B na classe A, então a classe A é chamada de classe externa e a classe B é chamada de classe interna membro.

O membro da classe interna pode acessar incondicionalmente todos os atributos do membro e métodos do membro da classe externa (incluindo membros privados e membros estáticos), mas a classe externa deseja acessar os membros da classe interna do membro deve primeiro criar um objeto do membro interno classe e, em seguida, aponte para este objeto Para acessar as propriedades da classe 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);
    }
}

Quando a classe interna do membro possui uma variável ou método membro com o mesmo nome da classe externa, o fenômeno oculto ocorrerá, isto é, os membros da classe interna do membro são acessados ​​por padrão. Se você deseja acessar um membro com o mesmo nome de uma classe externa, você precisa acessá-lo da seguinte forma:

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

Exemplo

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

A classe interna do membro depende da classe externa, ou seja, se você deseja criar um objeto da classe interna do membro, a premissa é que deve haver um objeto da classe 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 = "内部类";
    }
}

Dois, classe interna local

Uma classe interna local é uma classe definida em um método ou escopo. O acesso às classes internas locais é limitado a métodos ou escopos.

As classes internas locais são semelhantes às variáveis ​​locais e não podem ter modificadores públicos, protegidos, privados e estáticos.

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

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

Três, classe interna anônima

Contanto que uma classe seja abstrata ou uma interface, os métodos em suas subclasses podem ser implementados usando classes internas anônimas.

Uma classe interna anônima é a única classe sem um construtor. Como não tem construtor, o escopo de uso de classes internas anônimas é limitado. De modo geral, as classes internas anônimas são usadas para herdar outras classes ou 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();
}

Quatro, classe interna estática

Uma classe interna estática também é uma classe definida em outra classe.Esta classe é uma classe estática e não precisa depender da instanciação de uma classe externa para fazer chamadas.

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

Acho que você gosta

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