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 } } } - Declaradas com a palavra-chave
-
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); } } } - Declaradas sem a palavra-chave
-
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) |