Classes anônimas

Olha essa,

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…

import java.util.*;

class Lixo{
	public static void main (String[] args){
		//Criando classe anônima de uma classe concreta...
		A a = new A(){
			//Inicio da classe anônima
			
			public void metodo(){
				System.out.println("metodo anonimo");
			}
		}; 

		a.metodo();
	}
}

class A{
	A(){
		System.out.println("Construtor A");
	}
	public void metodo(){
		System.out.println("metodo A");
	}
}

Saida:
Construtor A
metodo A

class Lixo{
	public static void main (String[] args){
		//Criando classe anônima de uma interface...
		A a = new A(){
			//Inicio da classe anônima
			
			public void metodo(){
				System.out.println("metodo anonimo");
			}
		}; 

		a.metodo();
	}
}
interface A{
	public void metodo();
}

Saida:
metodo anonimo

1 curtida

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 :slight_smile:

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

1 curtida

só pra complementar: vc nao pode escrever um construtor numa classe anonima mas pode escrever um bloco inicializador de instancia:

class Teste {
  void metodo() {
      new Object() {
          { System.out.println("oi"); }

           // metodos da classe anonima...
      };
   }
}

se executar esse metodo vc vera “oi” no console

1 curtida

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:

[code]
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
}

}[/code]

Um bloco de inicialização também pode ser estático, bastando para isso colocar a palavra static antes do parênteses.

Legal, agora entendi melhor…

É que achei essas classes anônimas muito estranhas…será que é usado no dia-a-dia?

Obrigado pelas explicações…

Até

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.

Acho que a ideia eh tardia mas…

  
     Pintor p = new Pintor().build("renato"){
            private String nome;

            public Pintor build(String nome){
                 this.nome=nome;
                 return this;
            }

            void pinta(){
                 System.out.println(nome);
            }



     }
     
     

     interface Pintor{
              void pinta();
     }

Use esta carta!!!