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