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();.
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…
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(){ }
};
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.