public class TesteReferencias {
        public static void main(String[] args) {
            Gerente g1 = new Gerente();
            g1.setNome("Marcos");
            g1.setSalario(5000.0);
            Funcionario f = new Funcionario();
            f.setSalario(2000.0);
            EditorVideo ev = new EditorVideo();
            ev.setSalario(2500.0);
            ControleBonificacao controle = new ControleBonificacao();
            controle.registra(g1);
            controle.registra(f);
            controle.registra(ev);
            System.out.println(controle.getSoma());
        }
}No código acima estamos passando diversos tipos de funcionários para o método registra.
A seguir temos o código de ControleBonificacao:
public class ControleBonificacao {
        private double soma;
        public void registra(Funcionario f) {
            double boni = f.getBonificacao();
            this.soma = this.soma + boni;
        }
        public double getSoma() {
            return soma;
        }
}Minha dúvida é: por que o método registra() invoca o método específico do objeto, e não o da superclasse? Para melhor entendimento, por exemplo, estou enviando o objeto Gerente g1 como argumento, porém o método registra() o recebe como uma referência Funcionário f, correto? Então por que o método não invoca o getBonificacao() da referência f?
 
            