Uma classe interna anônima, como diz o termo, é uma classe sem nome, ela é declarada ou como estendendo uma classe, ou como implementando uma interface. Vejamos o primero caso:
class Animal{
public void eat(){
System.out.println("food");
}
}
class Dog{
Animal p = new Animal(){
public void eat(){
System.out.println("meat");
}
public void qualquerCoisa(){}
};
}
Repare que a classe Dog tem apenas uma instância de variável,
p. A sintaxe peculiar acima indica que uma instância de Animal será criada, mas ela será a instância de uma classe que estende Animal e a declaração dessa classe segue ao
new Animal(). Outro ponto importante é que o método
qualquerCoisa() não pode ser chamado por
p.qualquerCoisa(), já que o tipo de
p é a superclasse Animal, que não tem esse método.
Exemplo do segundo caso:
interface Enumeravel{
public boolean contavel();
}
class Numeros{
Enumeravel e = new Enumeravel(){
public boolean contavel(){return true;}
};
}
Por fim, a classse anônima pode ser criada também como argumento de um método, ou seja, no interior da sua declaração. Isso é muito comum ao lidarmos com listeners de objetos swing. Muitos já devem ter visto trechos de código semelhantes ao abaixo:
JButton botao;
botao.addListener(new ActionListener(){
public void actionPerformed(ActioEvent event){
}
};