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

Sobrescrita de método na classe filha vs polimorfismo

Quais seriam as diferenças entre você sobrescrever um método herdado da classe mãe na classe filha e utilizar o polimorfismo para executar o mesmo método? É a mesma coisa?

Por exemplo:

public class Animal {
    public void emitirSom() {
        System.out.println("Som do animal");
    }
}

public class Cachorro extends Animal {
    @Override
    public void emitirSom() {
        System.out.println("Au au");
    }    
}

public class Teste {
    public static void main(String args[] args) {
        Cachorro cachorro = new Cachorro();
        Animal cachorro2 = new Cachorro();
    }

    cachorro.emitirSom();
    cachorro2.emitirSom();
}

Dado esse cenário eles utilizariam o mesmo método e teriam o mesmo efeito. Você poderia utilizar tanto a referência do tipo Cachorro quanto a referência do tipo Animal. Os dois teriam o mesmo efeito certo?

Mas supondo que eu tenha vários outros animais e gostaria de reutilizar o método emitirSom(). Aí sim nesse cenário, faz sentido criar uma classe que gerencia a emissão de sons de animais (SonsDeAnimais por exemplo) e um método que recebe uma referência do tipo mais genérico emitirSom(Animal animal) e dentro dele chamar o método que em tempo e execução aciona a implementação correta.

Eu queria só fazer um double check de conhecimento aqui pra ver se realmente entendi isso.

1 resposta
solução!

sim, o jeito que você falou irá funcionar perfeitamente. Acho que a melhor forma de responder seria colocando em outro exemplo,

tudo que você extende você ganha os métodos, e eles podem ser sobrescristo

o caso mais classico é o método equals, hashcode, toString, que você herda da classe object e pode implementar ou não.

Ex. se você tem esse cenário dessas duas classes (Animal, Cachorro) e quiser implementar esses métodos você pode, ou seja, se você quiser apagar esse emitirSom() e sobrescrever o toString fazendo a mesma coisa irá funcionar da mesma forma.

ex:

// classe Animal
public String toString(){
    return "som animal";
}
// classe Cachorro
public String toString(){
    return "au au";
}

se você criar a classe EmissorSons com o método emitirSomDo(Animal animal) e dentro desse método fizer isso

public void emitirSom(Animal animal){
    System.out.println(animal);
}

irá imprimir o conteúdo do toString das classes;

Eu uso uma estratégia em algumas classes que elas herdam de uma superclasse se método algum só para deixar algo bem genérico o possivel e depois faço o cast, dai o interessante é uso de interface para não ter o problema de ter "multiplas heranças"

ex que você pode fazer tbm

levando em consideranção que não é somente animal que faz som, isso abriria a possibilidade de você usar com uma classe caminhão por ex

public interface EmissorSom{
    public String emitirSom()
}

public class Animal implements EmissorSom{
    public String emitirSom(){
        return "emitir som";
    }
}
public class Cachorro extends Animal{
    public String emitirSom(){
        return "au au";
    }
}
public class Veiculo implements EmissorSom{
    public String emitirSom(){
        return "vuuuuu";
    }
}

public class EmissorSomImpl{
    public void executar(EmissorSom emissor){
        System.out.println(emissor.emitirSom());
    }
}

espero que tenha entendido o exemplo