Sobes.tech
Middle

Quais são as diferenças entre classes aninhadas (nested) e classes internas (inner) em Java?

sobes.tech IA

Resposta da IA

  • Classes aninhadas (Nested classes): Membros estáticos da classe externa. Não têm acesso direto aos membros não estáticos (campos e métodos) da classe externa, apenas através de uma instância da classe externa. São declaradas com a palavra-chave static.

  • Classes internas (Inner classes): Membros não estáticos da classe externa. Têm acesso completo a todos os membros (estáticos e não estáticos) da classe externa, incluindo privados. Para criar uma instância de uma classe interna, é necessária uma instância da classe externa. Não usam a palavra-chave static.

Exemplo:

// Classe externa
class Outer {
    private int outerField = 10;
    private static int staticOuterField = 20;

    // Classe aninhada estática
    static class StaticNestedClass {
        void display() {
            // Acesso apenas aos membros estáticos da classe externa
            System.out.println("Nested estático: " + staticOuterField);
            // Não há acesso direto a outerField
            // System.out.println(outerField); // Erro de compilação
        }
    }

    // Classe interna não estática
    class InnerClass {
        void display() {
            // Acesso a todos os membros da classe externa
            System.out.println("Interna: " + outerField);
            System.out.println("Interna (estática): " + staticOuterField);
        }
    }
}

// Uso
public class Main {
    public static void main(String[] args) {
        // Criar instância de classe aninhada estática
        Outer.StaticNestedClass staticNested = new Outer.StaticNestedClass();
        staticNested.display();

        // Criar instância de classe interna requer uma instância da classe externa
        Outer outer = new Outer();
        Outer.InnerClass inner = outer.new InnerClass();
        inner.display();
    }
}
Característica Classe aninhada (Nested Class) Classe interna (Inner Class)
Palavra-chave static Não
Acesso aos membros da classe externa Apenas estáticos Todos
Requer uma instância da classe externa para criar uma instância Não Sim
Ligação com a instância da classe externa Não Sim