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 |