Sobes.tech
Middle

Quais são os tipos de classes aninhadas?

sobes.tech IA

Resposta da IA

Classes internas estáticas e classes internas (classes internas não estáticas).

  • Classes internas estáticas:

    • Declaradas com a palavra-chave static.
    • Têm acesso apenas aos membros estáticos (campos e métodos) da classe externa, incluindo os privados.
    • Não têm acesso direto aos membros não estáticos da classe externa.
    • Podem ser instanciadas sem uma instância da classe externa.
    class Outer {
        private static int staticVar = 10;
        private int instanceVar = 20;
    
        static class StaticNested {
            void display() {
                System.out.println("Var estática: " + staticVar);
                // System.out.println("Var de instância: " + instanceVar); // Erro de compilação
            }
        }
    }
    
  • Classes internas (classes internas não estáticas):

    • Declaradas sem a palavra-chave static.
    • Têm acesso completo a todos os membros (estáticos e não estáticos) da classe externa, incluindo os privados.
    • Não podem conter membros estáticos (campos ou métodos), exceto constantes finais.
    • Requerem uma instância da classe externa para sua criação.
    class Outer {
        private static int staticVar = 10;
        private int instanceVar = 20;
    
        class Inner {
            void display() {
                System.out.println("Var estática: " + staticVar);
                System.out.println("Var de instância: " + instanceVar);
            }
        }
    }
    
  • Classes locais:

    • Declaradas dentro de métodos, construtores ou blocos de inicialização.
    • Têm acesso a todas as variáveis locais finais e efetivamente finais, bem como aos membros da classe externa em que são definidas.
    • Seu escopo de visibilidade é limitado ao bloco em que são declaradas.
    class Outer {
        void myMethod() {
            final int localVar = 5; // Efetivamente final
    
            class LocalInner {
                void display() {
                    System.out.println("Var local: " + localVar);
                }
            }
    
            LocalInner local = new LocalInner();
            local.display();
        }
    }
    
  • Classes anónimas:

    • Classes locais sem nome.
    • Criadas e instanciadas simultaneamente.
    • São frequentemente usadas para criar implementações de interfaces ou estender classes.
    interface MyInterface {
        void doSomething();
    }
    
    class Outer {
        void myMethod() {
            MyInterface anon = new MyInterface() {
                @Override
                public void doSomething() {
                    System.out.println("Fazendo algo anonimamente.");
                }
            };
            anon.doSomething();
        }
    }
    

Principais diferenças entre classes internas estáticas e classes internas:

Característica Classe interna estática Classe interna
Palavra-chave static Ausente
Acesso aos membros Apenas aos membros estáticos da Todos os membros da classe
classe externa externa
Criação de instância Sem uma instância da classe externa Requer uma instância da classe externa
Membros estáticos Podem conter Não podem conter (exceto constantes)