Veja bem, neste exemplo que deste:
vmenck:
Interface exemplo = new ObjetoConcreto();
A classe ObjetoConcreto tem que implementar/extender a "class" Interface, se não esta associação não é possível!
Agora neste caso:
vmenck:
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
});
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:
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
}
}
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.