Observe que depois da instanciação, há uma abertura de bloco. Por quê? O que isso faz?
Um bloco aberto em instanciação
1 Resposta
Isso se chama Classe Anonima - teste aqui: http://ideone.com/MlDwKn
import java.util.*;
import java.lang.*;
import java.io.*;
import javax.swing.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
Object tela1 = new JPanel() ;
Object tela2 = new JPanel() {} ;
System.out.println(tela1.getClass());
System.out.println(tela2.getClass());
}
}
vamos la, por que existe este bloco? pq vc ( ou outro programador ) colocou isso. pode ser um erro.
qual a utilidade pratica disso? imagine que vc quer extender uma classe que existe ( ou mesmo implementar uma Interface ) e nao quer criar um .java só pra isso ( afinal pode fazer sentido em um determinado contexto, como quando vc implementa Runnable quando quer trabalhar com Threads ) vc pode fazer uso de classes anonimas.
veja o output
class javax.swing.JPanel
class Ideone$1
a primeira mostra a classe JPanel, a segunda mostra Ideone$1, ou seja, uma classe anonima acessivel apenas dentro da classe Ideone. Em outras palavras, tela2 nesse caso é uma instancia de uma_especialização_ da classe JPanel ( que não faz nada de diferente ) enquanto tela1 é uma instancia, digamos, pura de um JPanel.
Entenda que o conceito que estamos falando é o de `É UM``
um JPanel herda de um javax.swing.AbstractButton,
logo JPanel É UM AbstractButton. vc pode fazer
AbstractButton b =
new JPanel();
e como todo o objeto É UM Object
Object o =
new JPanel();
Entretanto nesse exemplo, se vc chamar o.toString() vc nao vai executar o toString da classe Object, e sim o metodo que foi especializado por alguma das classes ( nesse exemplo vem de https://docs.oracle.com/javase/7/docs/api/java/awt/Component.html#toString() )
Mas vc nao pode fazer o.updateUI() pq esse metodo foi definido no JPanel, mas a variavel o é um Object, e Objects tem um conjunto bem limitado de metodos.
Estamos falando de Polimorfismo.
essa documentação explicará melhor: https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html
Quando vc programa uma interface Grafica ( usando Swing por exemplo ) cada ação pode gerar um evento. Uma forma de trabalhar com eventos é criando classes anonimas pois muitas vezes vc quer amarrar uma ação a outra ( como clicar no botão e atualizar um label ).
Aqui tem uma descrição melhor:
https://docs.oracle.com/javase/tutorial/uiswing/events/
No passado, este recurso foi util para emular lambdas, como criar um comparador especifico e utilizar no Sort de um array. A partir das versões mais novas, com o suporte de Lambdas e, mais especificamente, de Interfaces Funcionais, vc tem um grande conjunto de ferramentas para deixar o seu codigo mais expressivo e mais proximo de uma linguagem funcional.
