ActionListener é uma classe abstrata, mas ela pode ser instanciada?

Estou começando a estudar java nessas férias do meio do ano quando vejo isso:

package ExemploColor;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JColorChooser;
import javax.swing.JPanel;

public class ShowColors extends JFrame{
	//ISSO É UMA CLASE

private JButton changeColorJButton;//BOTÃO
private Color color = Color.LIGHT_GRAY;
private JPanel colorJPanel;//PAINEL

public ShowColors()
{
    super( "Usando o JColorChooser" );
   
    colorJPanel = new JPanel();
    colorJPanel.setBackground( color );
   
    changeColorJButton = new JButton( "Escolher a cor" );
    changeColorJButton.addActionListener(
            new ActionListener()
            {
                public void actionPerformed( ActionEvent event )
                {
                    color = JColorChooser.showDialog(
                            ShowColors.this, "Escolher a color", color );
                   
                    if( color == null )
                        color = Color.LIGHT_GRAY;
                    colorJPanel.setBackground( color );
                }
            }
            );
   
    add( colorJPanel, BorderLayout.CENTER );
    add( changeColorJButton, BorderLayout.SOUTH );
   
    setSize( 400, 130 );
    setVisible( true );
 }
}

OBS.:Esse código não é meu, é do site java progressivo e se encontra nesse endereço: http://www.javaprogressivo.net/2012/08/java-graficos-e-2d-parte-1-usando-o.html.

minha dúvida está exatamente em :

changeColorJButton = new JButton( "Escolher a cor" );
    changeColorJButton.addActionListener(
            new ActionListener()
            {
                public void actionPerformed( ActionEvent event )
                {
                    color = JColorChooser.showDialog(
                            ShowColors.this, "Escolher a color", color );
                   
                    if( color == null )
                        color = Color.LIGHT_GRAY;
                    colorJPanel.setBackground( color );
                }
            }
);

Por que o programador em questão colocou “new ActionListener()” ao invés de colocar uma instância de uma classe feita por ele e colocada como ouvinte. E outra, por que ele dá um “override” no action performed aí no meio desses parênteses. Desculpem-me pela leiguice em java, mas não sou muito familiarizado com sendo definidos ou redefinidos dentro de parênteses, eu vim do C. E java é a primeira linguagem O.O. que estudo.

Por favor, mentes ávidas do amanhã, me ajudem.

Leia sobre classes anônimas (anonymous classes) e você vai entender o código. Em resumo, você pode instanciar uma classe ou interface e implementar os métodos abstratos sem ter que criar uma classe nomeada.

https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

1 curtida

Caro alcunha esmiralha,

Nunca pensei que seria tão rápida a resposta. Muito obrigado. Fiquei um pouco frustado em não entender isso, mas, já que estou esclarecido, vou dar consecutividade ao meu estudo, na verdade nem parei para dormir desde que postei. Bons estudos e uma ótima carreira para você também alcunha esmiralha, mais uma vez muito obrigado.