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.

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
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!!