Porque não

[code]
class Animal
{
public void eat()
{ }
}

class Horse extends Animal
{
public void eat()
{ }

public void buck() { }
}

[/code]

Porque dado o código acima, eu não posso fazer o seguinte conjunto de códigos abaixo:

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

Pq vc esta lidando com um “Animal”, nao com um “Horse”. Pra ter acesso ao metodo “buck()”, voce precisaria fazer um cast de “Animal” para “Horse”, assim:

Animal c = new Horse(); Horse h = (Horse) c; c.buck();

Ou, de forma mais curta:

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

Mas eu estou instanciando um objeto do tipo Horse… o compilador só verifica o tipo de referência e não o da instância então…

Sim, pq ele nao tem como verificar o tipo da instancia, e na verdade nao faria o menor sentido fazer essa verificacao, se vc pensar bem :wink:

Esse eh todo o tchans do polimorfismo :wink:

Se Animal fosse uma interface seria possível.

E se esta interface descrevesse um método buck();