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… 
Se alguem poder exclarecer mais um pouco… 
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.