Classes internas de Java
As Inner Classes do Java são classes definidas dentro de outra classe. Eles são usados para agrupar logicamente as classes que são usadas apenas em um lugar, aumentar o encapsulamento e podem levar a um código mais legível e de fácil manutenção. As classes internas podem acessar os membros (inclusive os membros privados) da classe externa.
Tipos de classes internas
- Classe aninhada não estática (classe interna): Associado a uma instância da classe externa.
- Classe aninhada estática: Não está associado a uma instância da classe externa e pode acessar somente os membros estáticos da classe externa.
- Classe interna local: Definido em um bloco, normalmente um método.
- Classe interna anônima: Uma classe sem nome, usada para instanciar objetos com determinadas funcionalidades "on-the-fly".
Exemplos
Exemplo 1: Classe interna não estática
public class OuterClass {
private String message = "Hello from Outer Class";
class InnerClass {
void display() {
System.out.println(message);
}
}
public static void main(String[] args) {
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();
inner.display();
}
}
Neste exemplo, InnerClass
é uma classe interna não estática. Ele pode acessar o campo message
de OuterClass
. Uma instância de InnerClass
é criada usando uma instância de OuterClass
.
Exemplo 2: Classe aninhada estática
public class OuterClass {
private static String message = "Hello from Static Nested Class";
static class StaticNestedClass {
void display() {
System.out.println(message);
}
}
public static void main(String[] args) {
OuterClass.StaticNestedClass nested = new OuterClass.StaticNestedClass();
nested.display();
}
}
Aqui, StaticNestedClass
é uma classe aninhada estática. Ele pode acessar diretamente os membros estáticos do site OuterClass
. Nenhuma instância de OuterClass
é necessária para criar uma instância de StaticNestedClass
.
Exemplo 3: Classe interna anônima
public class OuterClass {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Running from Anonymous Inner Class");
}
};
new Thread(runnable).start();
}
}
Este exemplo demonstra uma classe interna anônima que implementa a interface Runnable
. Ele é usado para fornecer uma implementação específica do método run
em tempo real.
Dicas e práticas recomendadas
- Use com moderação: As classes internas podem tornar o código mais difícil de ler se forem usadas em excesso. Use-as quando elas pertencerem logicamente à classe externa.
- Aulas anônimas: Ideal para implementar interfaces ou classes abstratas com uma pequena quantidade de funcionalidade.
- Acesso aos membros: As classes internas podem acessar todos os membros da classe externa, inclusive os membros privados, o que as torna úteis para o encapsulamento.
- Classes aninhadas estáticas: Use quando a classe aninhada não exigir acesso aos membros de instância da classe externa.
- Evite a complexidade: Mantenha as classes internas simples para evitar aumentar a complexidade da classe externa.