Quais são os tipos de classes internas na linguagem de programação?
sobes.tech IA
Resposta da IA
Classes aninhadas em Java:
-
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 } } } -
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-privateoupublic.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); } } } -
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
finalou efetivamentefinal, 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(); } } -
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 |