Para código abaixo, dependendo de quem o chama, são chamados diferentes "getBonificacao".
public void registra(Funcionario funcionario) {
double bonificacao = funcionario.getBonificacao();
this.soma += bonificacao;
}
Por exemplo, quando executamos o código abaixo
Funcionario funcionario = new Funcionario();
funcionario.setSalario(2000);
EditorVideo editor = new EditorVideo();
editor.setSalario(3000);
ControleBonificacao controle = new ControleBonificacao();
controle.registra(funcionario);
controle.registra(editor);
Temos que os seguintes métodos são executados (em suas respectivas classes):
public double getBonificacao() {
System.out.println("Chamando bonificação do funcionário");
return this.salario * 0.1;
}
public double getBonificacao() {
System.out.println("Chamando bonificação do editor de vídeo");
return super.getBonificacao() + 100;
}
Mas por que isso ocorre? O compilador entende que estamos passando como parâmetro na função "registra" um objeto do tipo Funcionario, certo? Dessa forma, deveria ser chamado apenas o método do Funcionario, não das demais classes.
Ou sabendo que foi passado um objeto de um tipo mais específico como parâmetro para a função "registra" é feita alguma referência para a classe específica? Isso, pelo menos para mim, não ficou claro. Se souberem onde posso buscar mais sobre isso, agradeço!