Duvida em polimorfismo

5 respostas
P

moçada, estudando para a certificação java me deparei com essa questao no livro …

public class TestAnimals{
    public static void main (String [] args) {
        Animal a = new Animal(); 
        Animal b = new Horse();//Animal ref. but a horse object
        a.eat(); //Runs the Animal Version of eat()
        b.eat(); //Runs the Horse Version of eat()
    }
}

class Animal{
    public void eat(){
         System.out.println("Generic Animal eating generically");
   }
}

class Horse extends Animal{
    public void eat() {
        System.out.println("horse eating hay, oats and horse treats");
    }
    public void buck(){}
}

ate ai tudo bem … sei que Animal b = new Horse() é um objeto Horse utilizando uma referencia da classe Animal, e tal…

mas a pergunta é a seguinte …

nessa parte …

Animal a = new Animal();
a.eat() ;

vai chamar o metodo eat() do objeto Animal e

Animal b = new Animal();
b.eat();

vai chamar o metodo eat() do objeto Horse…

mas pq??

nao seria mais facil fazer isso…

Horse b = new Horse();
b.eat();

qual a diferençca de um para o outro? isso que nao entendo, sei como funciona e tudo, mas nao entendo o pq…

alguem me explica? :oops: :oops: :oops:

5 Respostas

R

Isso é polimorfismo.

digamos que você vai fazer um método que precise de um Animal, na assinatura você coloca: metodoA(Animal a)

desta forma, você pode passar um Horse que o método fara o mesmo.

o lance de qual método ele chama, é muito tranquilo, ele vai chamar o método da instancia, veja bem:

digamos que o nosso metodoA queira fazer o animal comer e descomer, ele faz:

a.come();
a.desCome();

o Animal generico come sentado com garfo e faca, ja o Horse come em pé no estabulo, se eu digo então:

Animal c = new Horse();
c.come();

que metodo come() ele deve chamar, o que come sentado ou em pé?

sabendo que este animal é um Horse, e que ele come em pé?

P

pera ai cara…

esses metodos seus estao em qual classe? na Horse ou na Animal?

nesse exemplo que vc deu chamaria o metodo da classe Horse, ja que é uma instancia da classe Horse() certo?

seus metodos estao entao na classe Animal e a classe Horse extends sua classe Animal ?

se for asssim , o que nao entendo é:

animal a = new Horse();
a.come();

chama a versao Horse() do metodo come, perfeito?

mas pra que se eu posso fazer

horse a = new Horse();
a.come();

e chamar a mesma versao do metodo?

entendeu?

P

ninguem?

S

“pdioniziofilho”:

mas pra que se eu posso fazer

horse a = new Horse();
a.come();

e chamar a mesma versao do metodo?

entendeu?


Porque um dia essa classe pode deixar de usar um Horse pra usar um Coelho, e você vai ter que alterar os 2 locais onde diz Horse.
Usando: Animal a = new Horse();
Para a linha: a.come();
Tanto faz se esse a é um Horse ou um Coelho, o que é importa é que é um Animal que tem um método come(). Ficaria: Animal a = new Coelho(); a.come();
Pode parecer bobagem, mas:
Se uma classe XYZ qualquer tem um método:

public void algumaCoisa(Horse a) { a.come(); // ... }
E você não vai usar mais um Horse, você vai que alterar também essa classe. Códigos desse tipo podem estar espalhados por todo o projeto.

Usando Animal, você pode passar Horse, Coelho ou qualquer outro bicho que venha a ser criado, sem modificar nada.

Se a classe Horse deixar de desistir, por que a classe XYZ deveria ser alterada? Ela só quer receber um Animal e chamar métodos de Animal, ela não quer saber quantos e quais tipos de Animal existem.

P

acho que agora começo a entender…

vlw! :grin:

Criado 12 de março de 2007
Ultima resposta 14 de mar. de 2007
Respostas 5
Participantes 3