Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Poliformismo, tipo de referencia e tipo de objeto

Por que ao usar o tipo Funcionario na referência do objeto Gerente, ao calcular a soma das bonificações ele puxa o método do gerente? Eu tive a impressão em um dos videos anteriores que não era possível acessar um método de um objeto que estivesse referenciado com um tipo diferente do tipo do objeto.

4 respostas

Olá Gabriel,

isso que é o polimorfismo, invocar um método por meio de uma variável de superclasse e em tempo de execução, chamar a versão correta da subclasse

O código

Funcionario g1 = new Gerente()
g1.getBonificacao()

Invocará o método implementado em Gerente caso existir.

Oi Gabriel, tudo bem?

Realmente, isso é uma regra. Se fizermos algo como Funcionario g = new Gerente(), tudo que o Java enxerga inicialmente é que o tipo do objeto g é Funcionario, portanto teremos acesso apenas aos métodos de Funcionario. Levando isso em consideração, sabemos que não temos acesso aos métodos exclusivos da classe Gerente, como o setSenha e o autentica, já que eles não foram herdados da superclasse Funcionario. Mas veja bem, também temos o método getBonificacao que foi herdado da superclasse Funcionario e é aqui que a coisa fica interessante, se usarmos a referência g para chamar esse método como em g.getBonificacao(), o método chamado é o método da classe Gerente, e não a do Funcionario, o que contradiz aquela nossa primeira regra de levar em consideração apenas o tipo do objeto, correto?! Bom, nem sempre.

No polimorfismo, temos uma outra regrinha que diz que o método invocado é sempre o método mais específico. Ou seja, como o getBonificacao está presente tanto na superclasse Funcionario como na subclasse Gerente (já que ele foi sobrescrito aqui), o Java vai buscar pelo getBonificacao mais específico, checando se na classe Gerente temos uma outra versão desse mesmo cara para, em seguida, chamá-lo no lugar do método da superclasse.

Isso, claro, só funciona pois Gerente herda de Funcionario, o que mostra que Gerente nada mais é que um Funcionario com mais particularidades, ou melhor dizendo, um Funcionario mais específico! :)

Espero ter ajudado, qualquer dúvida estou à disposição!

Bons estudos!!

Acho que estou entendo melhor agora haha,

Então o polimorfismo só vai funcionar se o método existir na classe mãe e estiver sobrescrita na classe filha?

solução!

Oi Gabriel, tudo bem?

Isso mesmo, quando sobrescrevemos um método da superclasse estamos fazendo uso do polimorfismo. E é exatamente essa a motivação de usarmos o polimorfismo em Java: queremos que classes diferentes (mas que herdam de uma mesma superclasse) sejam capazes de responder a um mesmo chamado, porém de maneiras diferentes. Assim como fizemos com g.getBonificacao() que permitiu que Gerente respondesse ao chamado, mesmo o tipo da referência sendo da superclasseFuncionario.

Polimorfismo é um conceito fundamental para dominar o paradigma de Orientação a Objetos, então se surgir qualquer dúvida relacionada, não hesite em perguntar aqui no fórum!

Bons estudos!!