Operador new X Interface

Olá galera…
Minha duvida é a seguinte…
Sabemos que quando vamos contruir um objeto usamos o operador new.
No caso de uma interface, podemos ter algo assim tambem: Interface exemplo = new ObjetoConcreto();. :smiley:
Mas e quando adicionamos um evento, por exemplo um ActionListener, fazemos assim:

button.addActionListener(new ActionListener(){

@Override
public void actionPerformed(ActionEvent e) {
	// TODO Auto-generated method stub
			
}

});

O que acontece??..ActionListener é uma interface…e estamos usando um operador new??Como isso ocorre? :?:
Abraço…

Interessante a sua pergunta, talvez o compilador verifique que implementacao seja anonima sei la chutando mesmo , amanha irei dar uma pesquisada.

Classe interna anônima definida no argumento.
Assim é chamado a forma de vc passar uma interface dentro de um método que ainda não foi implementada por uma classe. Então isso é feito tudo de uma só vez.
Por exemplo: Digamos que vc tenha um método que receba um tipo de interface X, mas nós não temos nada desse tipo. Então é necessário criar uma classe que implemente os métodos da interface e depois passamos como argumento no método. Poderiamos fazer tudo isso por partes, mas a JAVA nos permite ganhar tempo, fazendo tudo de uma só vez e complicando um pouco a vida dos iniciantes para entender como é feito.

Dá uma olhada nisso:

Não se deixe enganar por qualquer tentativa de instanciação de interface que não seja uma classe interna anônima. A linha a seguir não é válida,

Runnable r = new Runnable(); // impossível instanciar a interface

enquanto a que se encontra abaixo é válida, porque está instanciando um implementador da interface Runnable(uma classe de implementação anônima):

Runnable r = new Runnable(){ // chave em vez de ponto e virgula public void run(){ } };

Espero ter ajudado.
Abraços,
Rulio Vangellis.

Veja bem, neste exemplo que deste:

A classe ObjetoConcreto tem que implementar/extender a “class” Interface, se não esta associação não é possível!

Agora neste caso:

O new ActionListener() cria uma nova instancia da class ActionListener, que é uma interface, então não pode criar a instancia sem implementar os métodos da interface, por isso para criar esta instancia é preciso implementar os seus métodos, que podem ser definidos entro das {}. Ai dentro das { } vc pode implementar os métodos, vc esta criando uma nova instancia da Interface e implementando os métodos ao mesmo tempo.

Neste caso o @Override esta incorreto, por q isto não é Override e sim implementação de um método definido na interface, o @Override é desnecessário, e induz a uma interpretação errada, pensando que esta alterando a instancia da classe, e não implementando uma interface.

Isto aqui não seria nada prático ficar fazendo:

[code]public class MyClass {
public MyClass() {
JButton b = new JButton();
b.addActionListener(new myActionListener());
}
}

class myActionListener implements ActionEvent {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
}[/code]

Ficar implementando uma classe só para fazer um click para um botão q normalmente não temos a mesma ação para varios botões, não é muito viável na maioria dos casos.

Criar uma instancia e implementar a interface ao mesmo tempo é muito mais prático, este recurso acaba por ser mais no sentido de facilitar a vida.

Caramba, essa aí tem uma cara de pegadinha de prova da SCJP

Vivendo, Aprendendo e estudando mais!

abraaaço

Valeu eduveks e Rulio.
Muito boa as explicações…e é isso aí galera.
Como já disseram…Vivendo e aprendendo, né!!

Um Abraço a todos que responderam…

Vinicius