Um bloco aberto em instanciação

1 resposta Resolvido
java
H

Observe que depois da instanciação, há uma abertura de bloco. Por quê? O que isso faz?

1 Resposta

peczenyj
Solucao aceita

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.

Criado 27 de setembro de 2016
Ultima resposta 27 de set. de 2016
Respostas 1
Participantes 2