[Resolvido] - Polimorfismo

11 respostas
J

Olá a todos do Guj.
Atualmente, estou estudando para obter a tão sonhada certificação java.
Ao estudar pelo livro da Katty Sierra, vi este exemplo e não consigo entender

Classe Animal

public class Animal {

	public void eat (){
		System.out.println("Animal comendo.");
	}
}

Classe Horse estendendo Animal

public class Horse extends Animal {

	@Override
	public void eat() {
		System.out.println("Horse comendo.");
	}
	
	public void correr(){
		System.out.println("Cavalo correndo.");
	}
}

Classe com o método main

public class ProgramaMain {

	public static void main(String[] args) {
		Animal animal  = new Animal();
		Animal animal2 = new Horse();
		
		animal.eat();
		animal2.eat();
		
		animal2.correr(); //está linha não compila!
	}
	
}

A minha dúvida consiste em: porque eu não consigo acessar o método correr?
Grato a todos.

11 Respostas

ViniGodoy

Por que não é todo Animal que corre. Só o Cavalo corre.

J

ViniGodoy:
Por que não é todo Animal que corre. Só o Cavalo corre.

Entendi.
Qual é a vantagem de se fazer isso?

Animal animal = new Horse();
Mikhas

jguarini:
ViniGodoy:
Por que não é todo Animal que corre. Só o Cavalo corre.

Entendi.
Qual é a vantagem de se fazer isso?

Animal animal = new Horse();

No lugar de fazer um metodo que alimenta Cavalos ou Bois ou cachorros… você pode fazer um metodo que alimenta Animais :wink:

J

Mikhas:
jguarini:
ViniGodoy:
Por que não é todo Animal que corre. Só o Cavalo corre.

Entendi.
Qual é a vantagem de se fazer isso?

Animal animal = new Horse();

No lugar de fazer um metodo que alimenta Cavalos ou Bois ou cachorros… você pode fazer um metodo que alimenta Animais ;)

Obrigado ViniGodoy e Mikhas

Qual seria a diferença entre

Animal animal = new Animal()

e isso?

Animal animalb = new Horse();
Marck

Ei, este post vai te ajudar muito. Veja a explicação do Mantu.

http://www.guj.com.br/posts/list/49267.java

abraço

el_loko

jguarini:
Mikhas:
jguarini:
ViniGodoy:
Por que não é todo Animal que corre. Só o Cavalo corre.

Entendi.
Qual é a vantagem de se fazer isso?

Animal animal = new Horse();

No lugar de fazer um metodo que alimenta Cavalos ou Bois ou cachorros… você pode fazer um metodo que alimenta Animais ;)

Obrigado ViniGodoy e Mikhas

Qual seria a diferença entre

Animal animal = new Animal()

e isso?

Animal animalb = new Horse();

A diferença é que animalb come e corre como cavalo. :slight_smile:
entende?

W

Basicamente sua dúvida se resume à :

O que define quais métodos você PODE invocar é o tipo da variável > Portanto, se a variável é do tipo Animal, você não pode invocar métodos que só existem dentro da classe Cavalo.

O que define quais métodos efetivamente serão invocados em RunTime é o tipo do objeto que você instanciou > Por isso el_loko disse que animalb corre e come como um cavalo, ou seja, mesmo que a referência seja para Animal, o objeto instanciado para animalb foi um Cavalo, então os métodos de Cavalo que serão executados e não os de Animal, mas como já disse, somente métodos que existirem tanto em Animal quanto em Cavalo poderão ser chamados.

B

jguarini:
Entendi.
Qual é a vantagem de se fazer isso?

Animal animal = new Horse();

Com vantagem animais e cavalos? Nenhuma. Agora com algum código útil:

List lista1  = new ArrayList();
List lista2 = new LinkedList();

ArrayList e LinkedList são duas implementações diferentes de listas, uma usa arrays, a outra listas ligadas, e cada uma tem a suas vantagens e desvantagens dependendo da situação (velocidade, memória, performance de inserção, remoção, procuras nas listas, acesso aleatório, etc).

Tá, mas se eu não me importar com a implementação, eu só quero uma lista onde eu coloque elementos, acesse eles na mesma ordem que inseri. Eu quero que meus métodos trabalhem com todo tipo de lista, não somente ou ArrayList, ou LinkedList. Daí partimos para usar List, uma interface que declara o que uma lista deve ter para funcionar, e qualquer um que implemente uma classe desta List conforme a sua especificação, vai ter certeza que a classe dele funciona com as minhas.

Isso se chama programar para interfaces, que é uma forma de programar visando implementações futuras. Dessa forma você consegue mudar um sistema, acrescentar novas regras, suporte a novas coisas, sem muito esforço.

el_loko

Bruno Laturner:
jguarini:
Entendi.
Qual é a vantagem de se fazer isso?

Animal animal = new Horse();

Com vantagem animais e cavalos? Nenhuma. Agora com algum código útil:

List lista1  = new ArrayList();
List lista2 = new LinkedList();

ArrayList e LinkedList são duas implementações diferentes de listas, uma usa arrays, a outra listas ligadas, e cada uma tem a suas vantagens e desvantagens dependendo da situação (velocidade, memória, performance de inserção, remoção, procuras nas listas, acesso aleatório, etc).

Tá, mas se eu não me importar com a implementação, eu só quero uma lista onde eu coloque elementos, acesse eles na mesma ordem que inseri. Eu quero que meus métodos trabalhem com todo tipo de lista, não somente ou ArrayList, ou LinkedList. Daí partimos para usar List, uma interface que declara o que uma lista deve ter para funcionar, e qualquer um que implemente uma classe desta List conforme a sua especificação, vai ter certeza que a classe dele funciona com as minhas.

Isso se chama programar para interfaces, que é uma forma de programar visando implementações futuras. Dessa forma você consegue mudar um sistema, acrescentar novas regras, suporte a novas coisas, sem muito esforço.

Sim. Visto que o exemplo de animais e cavalos servem apenas para simplificar o entendimento, eu diria que seria melhor assim:

public interface Animal() {
    void eat();
}

e a classe Cavalo assim:

public class Horse() {

    public void eat() {
        System.out.println("Cavalo comendo...");
    }
}
blackfalcon

el_loko:
Bruno Laturner:
jguarini:
Entendi.
Qual é a vantagem de se fazer isso?

Animal animal = new Horse();

Com vantagem animais e cavalos? Nenhuma. Agora com algum código útil:

List lista1  = new ArrayList();
List lista2 = new LinkedList();

ArrayList e LinkedList são duas implementações diferentes de listas, uma usa arrays, a outra listas ligadas, e cada uma tem a suas vantagens e desvantagens dependendo da situação (velocidade, memória, performance de inserção, remoção, procuras nas listas, acesso aleatório, etc).

Tá, mas se eu não me importar com a implementação, eu só quero uma lista onde eu coloque elementos, acesse eles na mesma ordem que inseri. Eu quero que meus métodos trabalhem com todo tipo de lista, não somente ou ArrayList, ou LinkedList. Daí partimos para usar List, uma interface que declara o que uma lista deve ter para funcionar, e qualquer um que implemente uma classe desta List conforme a sua especificação, vai ter certeza que a classe dele funciona com as minhas.

Isso se chama programar para interfaces, que é uma forma de programar visando implementações futuras. Dessa forma você consegue mudar um sistema, acrescentar novas regras, suporte a novas coisas, sem muito esforço.

Sim. Visto que o exemplo de animais e cavalos servem apenas para simplificar o entendimento, eu diria que seria melhor assim:

public interface Animal() {
    void eat();
}

e a classe Cavalo assim:

public class Horse() {

    public void eat() {
        System.out.println("Cavalo comendo...");
    }
}

Tambem acho, embora no livro deva estar daquele jeito para mostrar tambem sobre sobrescrita de metodos. So vendo la mesmo para saber porque o autor escreveu daquele jeito.

Mas enfim, o que a galera quis dizer a voce jguarini é basicamente isso mesmo.

Quando voce cria uma variavel voce nao faz assim:

int nome_variavel = 10;

Quando voce cria um objeto, funciona basicamente igual.

Animal animal1 = new Animal();

Nesse caso ai, estamos criando um objeto chamado animal (veja que é parecido com o nome_variavel, isso é apenas um nome que referencia seu objeto na memoria ram do seu computador) e que o conteudo do tipo Animal.

Em polimorfismo, voce deve prestar atenção no seguinte:

Voce sempre tem uma classe mais ampla, uma que engloba mais coisas.

Por exemplo, uma classe Automovel. Todo Automovel acelera, troca de marca e freia. Como caracteristicas (em java, sao os atributos) tem-se a cor, numero de rodas, tamanho.

Alguns exemplos de Automoveis (Classes que vao herdar (extends) da classe Automovel, Moto, Carro, Caminhao, Onibus) nao tem algo que existe na classe Automoveis. Ou seja, quando voce for criar um tipo desses, vamos supor Motos, e voce deseja adicionar um metodo a mais na classe, basta adicionar. Na hora de criar seu objeto, voce cria dizendo que ele é um Automovel mas que ele na verdade é uma Moto.

No caso que voce mostrou:

Animal animal1 = new Horse();

Seria dizer que animal1 é um Animal mas se comporta como um cavalo, nao como um porco.

Consegue entender amigo o porque do polimorfismo? É o que se ouve sempre quando aprende OOP, reutilização de codigo.

Abraços

J

Obrigado blackfalcon, el_loko, Bruno Laturner, weberdls, Marck, Mikhas e ViniGodoy.
Compreendi o uso do polimorfismo.

Criado 13 de maio de 2010
Ultima resposta 14 de mai. de 2010
Respostas 11
Participantes 8