[Duvidas] Polimorfismo

9 respostas
blackfalcon

Ola pessoal, gostaria de saber o que é Polimorfismo. Tambem gostaria de saber o que é uma classe Abstrata ou Concreta. Estou com o livro do deitel e nao da pra ler, leio leio leio e nao entendendo nada :frowning:

Se alguem puder exclarecer essas duvidas fazendo favor… :slight_smile:

Abraços

9 Respostas

rafaelglauber

Vou ser bem simples:

  1. Polimorfismo: É um dos recursos da OO onde é possível representar objetos (e quando eu tenho objetos é por que instanciei classes concretas) através de classes mais abstratas, exemplo: eu tenho a classe Pessoa e a classe PessoaJuridica que é uma especialização da classe Pessoa, com isso é possível eu criar uma referência da classe Pessoa para apontar a um objeto da classe PessoaJuridica, ou seja o código abaixo compila (se não tiver erro de digitação é claro):
class Pessoa{
}

class PessoaJuridica extends Pessoa{
  
  public void static teste(){
     Pessoa a = new PessoaJuridica();
  }

}

claro que existem outros modos de se ter polimofismo, esse foi só um exemplo.

  1. Com relação a classe abstrata temos duas coisas:

    1. Ela pode ser abstrata por ter em sua declaração a palavra abstract, com isso você tá dizendo ao compilador que ninguém pode criar um objeto dessa classe.
    2. Ela pode ser considerada abstrata pelo feto de existir “especializações” dela, no exemplo acima alguém poderia dizer que a classe Pessoa é “mais abstrata” que a PessoaJuridica.
  2. Sobre classe concreta seria o inverso da abstrata, ela não tem a palavra abstract em sua declaração, ou seja, ela implementa todos os métodos dela.

Espero que ajude um pouco, de qualquer forma continue estudando que uma hora vai…

blackfalcon
Pessoa a = new PessoaJuridica();

Eu nao entendi essa linha… :frowning:

Poderia explicar fazendo favor…

E valeu pela ajuda cara!

Abraços

Andre_Fonseca

blackfalcon:
Pessoa a = new PessoaJuridica();

Eu nao entendi essa linha… :frowning:

Poderia explicar fazendo favor…

E valeu pela ajuda cara!

Abraços

me corriga se eu estiver errado rafael, mas o código acima quer dizer o objeto a é é do tipo Pessoa, mas ele se comporta como uma PessoaJuridica

Andre_Fonseca

Deixa eu colocar um exemplo melhor:

Classe Pessoa.java

public class Pessoa {

	private int idade;
	private String nome;
	
	public Pessoa(int idade, String nome) {
		this.idade = idade;
		this.nome = nome;
	}

	public int getIdade() {
		return idade;
	}

	public String getNome() {
		return nome;
	}

	public void anda() {
		System.out.println("anda");
	}

	public void fala() {
		System.out.println("fala");
	}
}

Classe PessoaJuridica.java

public class PessoaJuridica extends Pessoa {

	private String identidade;
	

	public String getIdentidade() {
		return identidade;
	}

	public PessoaJuridica(int idade, String nome, String identidade) {
		super(idade, nome);
		this.identidade = identidade;
	}
	
	public void anda() {
		System.out.println("Pessoa Jurídica fica sentada!!");
	}
}

Classe que utiliza o polimorfismo

public class Utiliza {

	public static void main(String[] args) {
		Pessoa p = new PessoaJuridica(30,"Jose","advogado");
		p.anda(); // imprime Pessoa Jurídica fica sentada!!
//		p.getIdentidade();//erro de compilação não é uma pessoa juridica
	}
}

Ou seja, o objeto p é do tipo Pessoa - ele não tem o atributo Identidade, mas na hora de chamar o método anda() ele se comporta como uma pessoa jurídica, entendeu?? Muitas vezes isso é bem util quando você tem vários objetos que se comportam de maneira diferente ...

wbjava

Opa…

Então, sobre a diferença entre uma classe concreta e uma classe abstrata é que:

  • Uma classe abstrata não pode ser instânciada, ou seja, você não irá conseguir fazer um new MyClassAbstract(); , o que é possível em uma classe concreta;
  • Uma classe abstrata é usada para declarar métodos que serão implementados nas as classe que a extenderem, porém pode existir uma classe abstrata sem quaquer método abstrato, porém se existir um método abstrato a classe deve ser abstrata;

Essas são algumas diferenças básicas…

Espero ter ajudado.

:slight_smile:

blackfalcon

André Fonseca, valeu pela explicação. Esclareceu um pouco mais aqui rsrs

No caso de classes e metodos abstratos, continuei um pouco sem entender… No caso, o que isso tem haver com polimorfismo? Alguem pode dar um exemplo?

Eu ate tentei ler isso: http://www.guj.com.br/posts/list/49267.java#258941

Porem nao entendi muito bem… :frowning:

Se alguem poder exclarecer mais um pouco… :slight_smile:

Obrigado galera.

Abraços

thinet

Seguindo o exemplo anterior imagine a hierarquia:

Classe pessoa, genérica
class Pessoa {
         String telefone;

    void setTelefone(){...}
}
classe Pjuridica mais especifica
class PJuridica extends Pessoa {
  String cnpj;

void setCnpj (){... }
}

Nesse exemplo, usamos o benefício da herança, ou seja você herda os atributos e métodos de Pessoa em Pjuridica.

Digamos que posteriormente você cria essa classe

class PFisica extends Pessoa {
String rg;

void setRg {...}

}

Novamente, usamos a herança em PFisica

Temos duas classes especializadas, com características específicas, elas herdam por exemplo o método setTelefone que é comum nos dois casos, mais cada uma implementa um método que é importante para si mesma.

Desse modo você pode instanciar objetos específicos que herdam de pessoa.

Agora imagine o seguinte, se isso fosse um cadastro de clientes, pode existir clientes pessoa física e pessoa jurídica, mais existe um cliente pessoa?

Sacou, seria inútil (nesse exemplo) existir uma instância de pessoa, então você transforma essa classe em abstrata, dessa forma ninguém vai instância-la, porém você continua tendo a herança como benefício.

Quanto a criar métodos abstratos, é o seguinte:

um método abstrato é um método sem corpo, exemplo:

abstract void Iptu();   // repare que ele termina com ponto-e-vírgula
no nosso exemplo ficaria assim:
abstract class Pessoa {
         String telefone;

    void setTelefone(){...}
abstract void Iptu();
}

Isso significa que a próxima classe concreta (não abstract) que extender (herdar) de pessoa deverá

implementar esse método, mais ele não diz como, somente que deverá implementa-lo.

Algumas regras sobre abstract:

1 - Se existir um método abstract em uma classe, toda a classe será abstract (não estanciável)

2 - Classes abstract, podem ter métodos concretos (não abstract) e abstract

3 - Uma classe abstract nunca pode ser final

modificador final: Fim da hierarquia (não pode ser extendida, herdada)

modificador abstract: não pode ser estanciada (criar objetos) mais pode ser herdado

sergiotaborda

blackfalcon:
Ola pessoal, gostaria de saber o que é Polimorfismo. Tambem gostaria de saber o que é uma classe Abstrata ou Concreta.

Polimorfismo é muitas coisas :roll: :wink:

classe Abstrata : Aquela que não pode ser instanciada mas define métodos e algumas implementações.
classe Concreta: aquela que pode ser instanciada, i.e. que não é abstracta.

Mantu

blackfalcon:
André Fonseca, valeu pela explicação. Esclareceu um pouco mais aqui rsrs

No caso de classes e metodos abstratos, continuei um pouco sem entender… No caso, o que isso tem haver com polimorfismo? Alguem pode dar um exemplo?

Eu ate tentei ler isso: http://www.guj.com.br/posts/list/49267.java#258941

Porem nao entendi muito bem… :frowning:

Se alguem poder exclarecer mais um pouco… :slight_smile:

Obrigado galera.

Abraços


A característica principal de uma classe abstrata é ela não poder ser instanciada (Você não pode, em momento algum, dar um new nessa classe, criar um objeto dessa classe). Isso é interessante para o polimorfismo no sentido de você poder generalizar a referência a objetos diferentes que têm em comum a herança de uma classe pai (avô, bisavô, etc…), a qual é abstrata por não fazer sentido existir uma instância dela (Não faz sentido termos um objeto Animal, mas sim termos um objeto Cao, um objeto Gato, um objeto Galinha, etc).
Quando ao método abstrato, sua característica principal é não ter corpo. Por que isso? Bom, um método representa um comportamento que os objetos de uma classe têm. A forma como esse comportamento se realiza é determinada pelo que é codificado em seu corpo. Por exemplo: Sabemos que os cães se comunicam, assim como os gatos, porém de forma diferente. Mas ambos tipos de animais se comunicam. Cães e gatos apresentam um comportamento em comum, que é a comunicação, porém, cada tipo de animal executa esse comportamento à sua forma. Como um cão se comunica? Latindo. Como um gato se comunica? Miando. E um animal? Como um animal se comunica? Depende… Depende de que tipo de animal estamos falando. Isso nos mostra que, se fossemos representar em java uma classe Animal, esta teria um método abstrato chamado comunicar - pois não podemos precisar como um animal se comunica.
Sabemos que todo animal se comunica no mundo real. Uma forma de garantir essa premissa no java para uma classe Cachorro, por exemplo, seria fazê-la herdar de Animal. Ao estabelecer essa herança, e partindo do pressuposto que queremos ter objetos da classe Cachorro, esta classe deve definir como se executa o comportamento de comunicação, ou seja, deve implementar, dar um corpo ao método abstrato comunicar herdade de Animal. O mesmo aconteceria com uma classe Gato, por exemplo.
E onde entra o Polimorfismo nisso? Imagine que em seu programa de pet shop - onde você tem diversos tipos de animais diferentes - exista uma funcionalidade em que o usuário possa consultar “a voz” dos animais cadastrados. Temos uma lista com todos os animais do pet shop e queremos ir consultando, um a um, suas respectivas vozes. Recuperaríamos todos os animais - objetos Cachorro, objetos Gato, objetos Peixe, etc - de uma fonte de dados e arazenaríamos em uma lista do tipo List. Perceba que essa lista tem animais de diversos tipos diferentes, porém, como cada elemento dela é referenciado como Animal, podemos muito bem fazer algo assim:

for (Animal bicho: listaAnimais) {
    bicho.comunicar();
}

O fato da classe abstrata Animal definir o comportamento de comunicação - o método comunicar - nos permite passar por todos animais e “pedir” a eles que se comuniquem, para “ouvirmos suas vozes”. Cada vez que passamos pelo for, a variável bicho, que é do tipo Animal, vai estar referenciando um objeto o qual pode ser do tipo Cachorro, ou Gato, etc. O polimorfismo é o cara que “saca” qual é o tipo do objeto referenciado pela variável bicho(A despeito dessa variável ser do tipo Animal) e vai nesse tipo e executa o método comunicar por ele implementado. Por exemplo: Se em determinado momento do laço for, a variável bicho estiver referenciando uma objeto Cachorro, o polimorfismo vai fazer ser executado o método comunicar da classe Cachorro. Em um outro momento, se a variável bicho estiver referenciando uma objeto Gato, o polimorfismo vai fazer ser executado o método comunicar da classe Gato, e por aí vai.

Espero ter deixado mais claro.
Se persistir dúvidas, pergunte novamente.

Criado 1 de julho de 2008
Ultima resposta 2 de jul. de 2008
Respostas 9
Participantes 7