Em
java é possível definir uma classe ou interface aninhadas.
class AltoNivel{
static class ClasseAninhadaEstatica{ ... }
class
ClasseInterna{ ... }
}
No
trecho de programa acima a ClasseAninhadaEstatica tem caracteristicas
semelhantes aos métodos estáticos, não pode fazer referência a instâncias da
classe AltoNivel. Uma instância de
ClasseInterna só pode existir no contexto de uma instância da classe AltoNível.
A
linguagem Java permite definir as chamadas classes anônimas. Definir uma classe
anônima na verdade significa instânciar um objeto cuja classe é anônima!
Existem duas maneiras de definir classes anônimas (ou seja: existem duas formas
de instânciar um objeto cuja classe seja anônima):
1. new <nomeDaClasseBase>(<argumentos
opcionais>){corpo da classe}
2. new <nomeDaInterface>(){corpo da classe}
A
primeira forma corresponde “grosso modo” a:
class <Anonima> extends <nomeDaClasseBase> { corpo da classe }
new <Anonima>()
Instancie
um objeto de uma classe que não tem nome e que estende a classe
<nomeDaClasseBase>.
A
segunda forma corresponde “grosso modo” a:
class <Anonima> extends Object implements <nomeDaInterface>{corpo
da classe}
new <Anonima>()
Esta
segunda forma pode ser descrita como sendo: instancie um objeto de uma classe
que não tem nome que implementa a interface <nomeDaInterface> e que
estende a classe Object. Neste caso a classe anônima só pode implementar 1(uma)
interface.e estender somente a classe Object.
Não
há previsão de construtores para classes anônimas. Os argumentos opcionais da
primeira forma acima são passados para o construtor adequado da classe base. Na
segunda forma, os parênteses não devem apresentar argumentos (não existem
construtores para interfaces e a classe Object não possui construtores com
argumentos!). As classes aninhadas/internas e as classes anônimas são usadas,
principalmente, no contexto de
programação de interfaces gráficas de usuário (GUI).
O
programa abaixo mostra um uso sintético de classes anônimas, neste programa as referências retornadas pelo
operador new são descartadas e estamos interessados apenas no efeito colateral
das iniciações dos campos de instância:
interface I{}
class prog{
public static void main(String[] arg){
new Object(){
int i=m();
int
m(){System.out.println("1"); return 1;}
};
new I(){
int i=m();
int
m(){System.out.println("1"); return 1;}};
}
}