Quando crio uma classe anônima de uma classe concreta, posso sobrecarregar o construtor…new A() ou new A(int i)…por exemplo
Mais e quando crio uma classe anônima de uma interface? Onde está o construtor?
O código abaixo compila normalmente…
importjava.util.*;classLixo{publicstaticvoidmain(String[]args){//Criando classe anônima de uma classe concreta...Aa=newA(){//Inicio da classe anônimapublicvoidmetodo(){System.out.println("metodo anonimo");}};a.metodo();}}classA{A(){System.out.println("Construtor A");}publicvoidmetodo(){System.out.println("metodo A");}}
Saida:
Construtor A
metodo A
classLixo{publicstaticvoidmain(String[]args){//Criando classe anônima de uma interface...Aa=newA(){//Inicio da classe anônimapublicvoidmetodo(){System.out.println("metodo anonimo");}};a.metodo();}}interfaceA{publicvoidmetodo();}
não é possivel escrever um construtor em uma classe anonima, seja ela estendendo de uma classe ou implementando uma interface.
isso pelo simples fato de que escrever um construtor exige que vc saiba o nome da classe - e se a classe é anonima vc nao sabe o nome dela
na verdade o compilador gera um construtor pra vc no bytecode, mas que vc nao pode escrever ou chamar explicitamente.
no caso que voce fez, vc nao criou construtor na classe anonima e sim o construtor na classe “A” (que nao eh anonima). e o construtor dessa classe A é chamado pelo construtor que vc ganhou na sua classe anonima, por causa da chamada implicita a “super()” que todo construtor tem.
no caso da interface que vc fez, tambem ha esse construtor gerado pelo compilador e tambem ha a chamada a “super()”. só que dessa vez a sua classe mae é Object e nao A, por isso nenhuma mensagem aparece
S
sergiolopes1 like
só pra complementar: vc nao pode escrever um construtor numa classe anonima mas pode escrever um bloco inicializador de instancia:
classTeste{voidmetodo(){newObject(){{System.out.println("oi");}// metodos da classe anonima...};}}
se executar esse metodo vc vera “oi” no console
V
ViniGodoy
Mais uma complementação. É possível inicializar atributos em blocos de inicialização. Não são tão poderosos quanto os construtores, mas já quebram um galho em muito casos.
Para criar um bloco de inicialização, você simplesmente abre chaves e põe código dentro, sem escrever assinatura de método nenhuma:
public A a = new A() {
private List<X> listaDeX;
//Bloco de inicialização
{
listaDeX = new ArrayList<X>();
listaDeX.add(X.BLANK);
}
public void fazAlgumaCoisa() {
//Faz alguma coisa
}
}
Um bloco de inicialização também pode ser estático, bastando para isso colocar a palavra static antes do parênteses.
A
aurelio_silva
Legal, agora entendi melhor…
É que achei essas classes anônimas muito estranhas…será que é usado no dia-a-dia?
Obrigado pelas explicações…
Até
V
ViniGodoy
Sim, direto. São muito práticas.
Num futuro não muito distante, o Java implementará closures, que tratão uma forma ainda mais simples de criar pequenas classes anonimais, e permitirão uma abordagem mais funcional em Java.