Sobes.tech
Middle

Quais são os tipos de classes internas na linguagem de programação?

sobes.tech IA

Resposta da IA

Classes aninhadas em Java:

  1. Classes aninhadas estáticas (Static Nested Classes): Comportam-se como membros estáticos normais da classe. Não têm acesso aos membros não estáticos da classe externa. São criadas sem uma instância da classe externa.

    public class Outer {
        private static String staticMsg = "Mensagem estática";
        private String instanceMsg = "Mensagem de instância";
    
        static class StaticNested {
            void displayStatic() {
                // Acesso aos membros estáticos da classe externa
                System.out.println(staticMsg);
                // Sem acesso aos membros não estáticos da classe externa
                // System.out.println(instanceMsg); // Erro de compilação
            }
        }
    }
    
  2. Classes internas (Inner Classes): Relacionadas a uma instância da classe externa. Têm acesso completo a todos os membros (estáticos e não estáticos) da classe externa, incluindo privados. Podem ser declaradas private, protected, package-private ou public.

    public class Outer {
        private static String staticMsg = "Mensagem estática";
        private String instanceMsg = "Mensagem de instância";
    
        class Inner {
            void display() {
                // Acesso aos membros estáticos e não estáticos da classe externa
                System.out.println(staticMsg);
                System.out.println(instanceMsg);
            }
        }
    }
    
  3. Classes locais (Local Classes): Declaradas dentro de um bloco (método, construtor ou inicializador estático). Disponíveis apenas dentro desse bloco. Podem acessar variáveis locais e parâmetros do bloco que sejam final ou efetivamente final, bem como todos os membros da classe externa.

    public class Outer {
        private String instanceMsg = "Mensagem de instância";
    
        void methodWithLocalClass() {
            final String localVar = "Variável local"; // ou efetivamente final
    
            class Local {
                void display() {
                    System.out.println(instanceMsg);
                    System.out.println(localVar);
                }
            }
    
            Local localObj = new Local();
            localObj.display();
        }
    }
    
  4. Classes anónimas (Anonymous Classes): São classes locais sem nome. Usadas para declarar e criar uma instância de uma classe ao mesmo tempo, que implementa uma interface ou estende uma classe. São úteis para criar objetos pequenos e de uso único.

    public class Outer {
        void methodWithAnonymousClass() {
            // Classe anónima que implementa a interface Runnable
            Runnable myRunnable = new Runnable() {
                @Override
                public void run() {
                    System.out.println("Executando a partir de classe anónima");
                }
            };
            new Thread(myRunnable).start();
    
            // Classe anónima que estende a classe Thread
            Thread myThread = new Thread() {
                @Override
                public void run() {
                    System.out.println("Executando a partir de classe anónima que estende Thread");
                }
            };
            myThread.start();
        }
    }
    

Comparação dos tipos de classes aninhadas:

Tipo de classe Local de declaração Acesso aos membros da classe externa Necessita de uma instância da classe externa para criar Modificadores de acesso
Classe aninhada estática Dentro da classe, com a palavra-chave static. Apenas aos estáticos. Não Todos
Classe interna Dentro da classe (não estática). A todos (estáticos e não estáticos). Sim Todos
Classe local Dentro de um bloco (métodos, construtores, inicializadores). A todos os membros da classe externa + variáveis locais final ou efetivamente final. Sim Não (final ou abstract implícito)
Classe anónima Dentro de um bloco (expressão). A todos os membros da classe externa + variáveis locais final ou efetivamente final. Sim Não