Junior
O que são classes aninhadas?
sobes.tech IA
Resposta da IA
As classes aninhadas (nested classes) são classes declaradas dentro de outra classe. Elas podem ser estáticas (static nested classes) ou não estáticas (inner classes).
Classes aninhadas estáticas:
- São declaradas com o modificador
static. - Não têm acesso direto aos membros não estáticos da classe externa (apenas através de uma instância da classe externa).
- Podem conter membros estáticos e não estáticos.
- São criadas sem uma instância da classe externa.
public class Outer {
private static int staticOuterVar = 10;
private int instanceOuterVar = 20;
public static class StaticNested {
// Tem acesso a staticOuterVar
public void printStaticValue() {
System.out.println(staticOuterVar);
}
// Não tem acesso direto a instanceOuterVar
// public void printInstanceValue() {
// System.out.println(instanceOuterVar); // Erro de compilação
// }
}
}
Utilização da classe aninhada estática:
// Exemplo de criação de uma instância da classe aninhada estática
Outer.StaticNested nestedObject = new Outer.StaticNested();
nestedObject.printStaticValue(); // Vai imprimir 10
Classes internas (Inner Classes):
- Não são declaradas com
static. - Têm acesso completo a todos os membros da classe externa, incluindo privados.
- Não podem conter membros estáticos (exceto constantes de tempo de compilação).
- Requerem uma instância da classe externa para serem criadas.
public class Outer {
private static int staticOuterVar = 10;
private int instanceOuterVar = 20;
public class Inner {
// Tem acesso a staticOuterVar e instanceOuterVar
public void printValues() {
System.out.println(staticOuterVar); // Disponível
System.out.println(instanceOuterVar); // Disponível
}
}
}
Utilização da classe interna não estática:
// Exemplo de criação de uma instância da classe interna não estática
Outer outerObject = new Outer();
Outer.Inner innerObject = outerObject.new Inner();
innerObject.printValues(); // Vai imprimir 10 e 20
Vantagens do uso de classes aninhadas:
- Agrupamento lógico: Classes que são usadas apenas por outra classe podem ser agrupadas logicamente dentro dela.
- Encapsulamento: Classes aninhadas têm acesso aos membros privados da classe externa.
- Legibilidade e manutenção: O código torna-se mais organizado.
Tipos de classes internas não estáticas:
- Classes locais: Declaradas dentro de um método.
- Classes anônimas: Classes sem nome explícito, geralmente usadas para criar instâncias de uma classe abstrata, interface ou classe base com métodos sobrescritos.
Classe local:
public class Outer {
public void myMethod() {
class LocalClass {
void display() {
System.out.println("Dentro da classe local");
}
}
LocalClass local = new LocalClass();
local.display();
}
}
Classe anônima (exemplo com interface):
interface Greeting {
void sayHello();
}
public class Outer {
public void greet() {
Greeting anonymousGreeting = new Greeting() {
@Override
public void sayHello() {
System.out.println("Olá da classe anônima!");
}
};
anonymousGreeting.sayHello();
}
}