Em Java, é permitido definir uma classe dentro de uma classe, tal classe é chamada de classe interna, e a classe onde a classe interna está localizada é chamada de classe externa. No desenvolvimento real, de acordo com a posição, modificador e método de definição da classe interna, a classe interna pode ser dividida em quatro tipos, ou seja, classe interna membro, classe interna local, classe interna estática e classe interna anônima.
Classe interna de membro (classe interna de membro):
- Definido na posição de membro da classe externa, associada à instância da classe externa e à classe interna sem modificação estática .
- Todos os membros da classe externa, incluindo membros privados, podem ser acessados diretamente e as instâncias podem ser criadas por meio do objeto da classe externa.
- Sintaxe de uso: nome da classe externa.nome da classe interna nome da variável = novo nome da classe externa ().novo nome da classe interna ();
Classe interna local (classe interna local):
- Definido dentro de um método ou bloco de código, o escopo de ação é limitado ao método ou bloco de código onde está localizado.
- Não pode ter modificador de acesso e só pode ser usado dentro do método ou bloco de código no qual está definido.
- Pode acessar variáveis locais no método ou bloco de código (deve ser final ou efetivamente final).
- Sintaxe de uso: nome da classe interna da classe {...}
Classe interna estática (classe interna estática):
- Definida na classe externa, é uma classe interna decorada com static .
- Não tem nada a ver com a instância da classe externa e pode ser acessado diretamente através do nome da classe externa.Nome da classe interna.
- Você só pode acessar diretamente os membros estáticos da classe externa e criar instâncias , e não pode acessar membros não estáticos.
- Sintaxe de uso: nome da classe externa . nome da classe interna estática nome da variável = novo nome da classe externa ().nome da classe interna estática ();
Classe interna anônima (classe interna anônima):
- Não existe uma definição explícita e ela é criada diretamente pela instanciação de uma interface ou de uma classe abstrata.
- Nenhuma nomenclatura é necessária e geralmente é usada quando um método precisa ser substituído temporariamente para simplificar a escrita do código .
- Pode ser uma classe de implementação de uma interface ou uma subclasse herdada de uma classe abstrata.
- Sintaxe de uso: novo nome da interface/nome da classe abstrata() { //Parte de implementação da classe interna anônima}
Os exemplos a seguir demonstram o uso de diferentes tipos de classes internas:
public class OuterClass {
private int outerVariable = 10;
private static int outerStaticVariable = 20;
// 成员内部类
public class MemberInnerClass {
public void display() {
System.out.println("成员内部类:" + outerVariable);
}
}
// 静态内部类
public static class StaticInnerClass {
public void display() {
System.out.println("静态内部类:" + outerStaticVariable);
}
}
// 方法示例
public void displayLocalInnerClass() {
int localVariable = 30; // 局部变量
// 局部内部类
class LocalInnerClass {
public void display() {
System.out.println("局部内部类:" + localVariable);
}
}
LocalInnerClass localInnerObj = new LocalInnerClass();
localInnerObj.display();
}
// 匿名内部类示例
public void displayAnonymousInnerClass() {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类");
}
};
Thread thread = new Thread(runnable);
thread.start();
}
public static void main(String[] args) {
OuterClass outerObj = new OuterClass();
// 使用成员内部类
OuterClass.MemberInnerClass memberInnerObj = outerObj.new MemberInnerClass();
memberInnerObj.display();//运行:成员内部类:10
// 使用静态内部类
OuterClass.StaticInnerClass staticInnerObj = new OuterClass.StaticInnerClass();
staticInnerObj.display();//静态内部类:20
// 调用局部内部类示例方法
outerObj.displayLocalInnerClass();//局部内部类:30
// 调用匿名内部类示例方法
outerObj.displayAnonymousInnerClass();//匿名内部类
}
}
Este exemplo demonstra o uso de quatro tipos diferentes de classes internas:
-
Classe interna de membro (classe interna de membro): crie uma instância de classe interna por meio de uma instância de classe externa e seja capaz de acessar variáveis de membro da instância de classe externa.
-
Classe interna estática (classe interna estática): acesse a classe interna diretamente através do nome da classe externa, não tem nada a ver com a instância da classe externa e só pode acessar os membros estáticos da classe externa.
-
Classe interna local (Classe interna local): A classe interna definida no método só é visível no método e pode acessar as variáveis locais do método, mas as variáveis locais devem ser finais ou efetivamente finais.
-
Classe interna anônima (classe interna anônima): criada pela instanciação de uma interface ou classe abstrata e não possui definição explícita, geralmente usada para substituir um método necessário uma única vez. No exemplo, a interface Runnable é implementada por meio de uma classe interna anônima e um thread é criado.