Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Polimorfismo

Tenho uma dúvida sobre polimorfismo...

Quando você override um método da super class, quando chamar, o método override sempre vai ser chamado primeiro, caso não exista ele pega a referência mais genérica para aplicar.

Se eu criar uma super class Animal e adicionar Dog e Cat como child classes e sobrepor o método da super class sound(), irá funcionar

 public class Animal() {
    public void sound() {
         System.out.println("Default sound");
    }
}
public class Dog() {
   @Override
    public void sound() {
        System.out.println("Au au!");
    }
}
Animal dog = new Dog();

dog.sound();

Só que nesse caso acima, a minha referência genérica possuí o método e eu posso colocar o tipo de refêrencia como Animal. Se eu criar um método novo na class dog que não exista na super class, apontaria um erro tentar chamar o método. Gostaria de saber o por que e também quando usar referências genéricas para chamar uma class.

1 resposta
solução!

Oi Sophie! Tudo bem?

O que acontece tem a ver com tempo de compilação e tempo de execução: quando utilizamos uma referência (como em Animal dog), ela se refere ao tempo de compilação. Já ao criar o objeto (dando um new Dog()), falamos de tempo de execução. Quando fazemos Animal dog = new Dog();, o compilador separa uma referência na JVM do tipo Animal. Porém, no momento da execução, ele consegue fazer essa conversão. Por isso é possível que o método seja sobrescrito e seja impresso "Au au". Isso é uma regra da JVM para os overrides. Em outras linguagens, isso pode ser diferente.

Já quando não temos o método sound() na classe Animal e tentamos utilizá-lo no código que você colocou na pergunta, temos um erro de compilação. Exatamente devido ao funcionamento dos tempos de compilação e execução: o Java só vai entender que o Animal é um Dog no momento da execução, atribuindo referência ao tipo Dog. Então ele não reconhece, ao digitarmos, que aquela referência pode ter o método sound, causando um erro de compilação.

Existem várias utilidades para usarmos a referência genérica, como adicionar em listas: suponhamos que você tenha um zoológico com vários animais, e queira cadastrá-los em uma lista. Depois, quer imprimir o som que cada um deles faz. Seria complicado criar várias listas diferentes para cada tipo de Animal. Assim, daria pra criar uma lista de animais e utilizar o polimorfismo para ajudar na missão. Esse é um exemplo bem aleatório kkkkkk, mas ao longo dos seus estudos (seja com Java ou com qualquer outra linguagem que utilize orientação a objetos), você verá as aplicações do polimorfismo.

Espero ter ajudado! Qualquer dúvida estou à disposição :)

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!