Classe Anonima[RESOLVIDO]

10 respostas
thiagolopes

Amigos, mais uma vez estou aqui com uma pequena duvida.[color=blue] Pela logica nenhuma classe abstract podera ser instanciada sendo apenas herdade, correto?Sim! [/color] [color=red] Então porque diabos eu estou conseguindo fazer isto abaixo[/color] huahua.Pelo que eu observei estou criando na verdade uma classe anonima, como é que isto funciona, alguem poderia me ajudar? Abraços!

package classes;

import conexao.Conexao;


public abstract class Grupo extends Conexao {
	private String nomeGrupo;
	private int numeroDeCaixas;

	public void setNomeGrupo(String nomeRec) {
		this.nomeGrupo = nomeRec;
	};

	public String getNomeGrupo() {
		return this.nomeGrupo;
	}

	public abstract void inicarPerguntas();

	public abstract void numeroDePerguntas(int numRec);

}

//---------------------------------------------------------------------------
package classes;

import javax.swing.JOptionPane;

public class Principal {
	public static void main(String[] args) {
		Grupo a = new Grupo() {

			@Override
			public void numeroDePerguntas(int numRec) {
				// TODO Auto-generated method stub

			}

			@Override
			public void inicarPerguntas() {
				// TODO Auto-generated method stub

			}
		};
	}
}

10 Respostas

Andre_Brito

Porque você está sendo obrigado a implementar os métodos abstratos dela… Então você faz uma classe anônima e implementa os métodos que precisa pra fazer com que não seja mais abstrata, mas sim uma classe concreta anônima que é subclasse da abstrata.
Isso funciona com interfaces também.

Não tenho nem ideia se a minha resposta está certa… Mas o porquê de você poder fazer isso, é que você cria uma classe anônima que é sub da abstrata. Só que pra ser sub, tem que implementar os métodos assinados com abstract.

thiagolopes

Interessante! É verdade… tava observando aqui que se eu tirar os métodos abstract o compilador vai reclamar, sinceramente não sabia deste meio para criar classes abstract.Então no caso criei uma classe filha atraves de uma classe pai abstract na “marra” usando uma classe anonima ? Sinceramente fiquei meio confuso visto que tira os conceitos de O.O.Vlw pela ajuda amigo! Este conceito feito seria para interfaces tambem ! É verdade, toda interface seria public abstract, mas então no caso será que da para força na marra um instanciamento ? Fiquei confuso hehe;

Andre_Brito

Aparentemente sim… Acho que o que foi feito é uma classe anônima do tipo da abstrata… Quem sabe ela já usa um extends internamente pra fazer isso.

Acho que sim… É como se você criasse uma classe em outro arquivo que utilizasse a herança explicitamente.

Não leve em conta que o que falei foi totalmente verdade… Aparentemente é o que acontece. Vamos ver a opinião dos mais inteligentes.

rmendes08

Isso é possível porque classes anônimas são sub-classes do tipo declarado. Todas as regras que se aplicam a uma subclasse, com relação a escopo, visibilidade, etc. se aplicam a classes anônimas. Tente por exemplo, acessar um atributo private da classe original a partir da classe anônima e você vai ver que não dá certo.

thiagolopes

Interessante…Grato amigos pela ótima ajuda, porém no caso para criar uma classe anonima obrigatoriamente teria que ter um método tambem abstract ? Observei aqui no eclipse que não da para instanciar sem ter pelo menos um método abstract, ta certo isto mesmo ? Abraços!

rmendes08

Acho que o erro deve ser outro. É possivelmente criar uma classe interna anônima a partir de uma classe não abstrata. Talvez você esteja tentando criar uma classe anônima a partir de uma classe marcada como final.

discorpio

Bom dia a todos.

Concordo com o nosso amigo Rmendes08. É impossível voce declarar um método abstrato dentro de uma classe anônima, eis que, como voce pode perceber, classes anônimas são instanciadas no momento de sua declaração.

O que se pode fazer, foi o que voce fez inicialmente, ou seja, herdar uma classe anônima de uma classe abstrata e no momento de sua declaração e instanciação, voce implementar os métodos abstratos da super classe.

Outro erro possível que talvez esteja acontecendo é que voce deve estar fazendo sobreescrita dos métodos abstratos com a assinatura diferente ou com o nome diferente, isto causa erro no compilador, pois ele interpreta que voce esteja tentando implementar outros métodos, sem implementar os métodos abstratos, ou fazer sobrecarga de um método abstrato da super classe, sem que o mesmo tenha sido implementado.

rogelgarcia

Se vc nao tiver nenhum método na classe abstrata…

vc poderá fazer isso

Grupo g = new Grupo() { //aqui é criada uma classe anonima };

mas nao isso

Grupo g = new Grupo(); //aqui tentativa de instanciar uma abstrata
ViniGodoy

Não entendi qual é a dúvida.

A classe anônima é uma classe filha de grupo. Para que ela não seja abstract, terá que fornecer uma implementação para cada método, como qualquer filho teria que fazer.

Imagine isso:

public class GrupoFilho extends Grupo {

   public  void inicarPerguntas() {};  
   
  public void numeroDePerguntas(int numRec) {};
}

Essa é uma classe concreta válida, certo? Você também não poderia otimir nenhum desses método, certo?

Agora, simplesmente retire dela o nome, e dê uma sintaxe um pouco mais enxuta. Pronto, vc tem uma classe anônima.

Uma classe anônima também é uma classe. E é diferente da classe Grupo, embora seja na prática, filha dela.

Experiemente colocar essa linha depois da declaração do a:
if (a.getClass() == Grupo.class) {
   System.out.println("O objeto é da classe Grupo");
} else {
   System.out.println("O objeto não é da classe Grupo");
   if (a instanceof Grupo) {
       System.out.println("Porém é um filho dela.");
   }
}

E veja o que imprime.

thiagolopes

Obrigado pela ajuda de todos, com certeza deu para ter uma grande noção das classes anônimas a partir das inteligentes respostas de todos, abraços amigos e mais uma vez obrigado!

Criado 9 de abril de 2010
Ultima resposta 11 de abr. de 2010
Respostas 10
Participantes 6