O instrutor na aula coloca a função System.out.println() dentro do método getBonificacao() da classe Gerente, para provar que o java executa o método getBonificacao() mais específico.
No meu código, eu coloquei um System.out.println() dentro da minha classe Funcionario também, e olha o que aconteceu:
Executando o método da classe GERENTE
Executando o método da classe FUNCIONARIO
Executando o método da classe FUNCIONARIO
Executando o método da classe EDITORVIDEO
Executando o método da classe FUNCIONARIO
10950.0
Código da classe que contém o método main()
public class TestaReferencias {
public static void main(String[] args) {
Funcionario g1 = new Gerente();
g1.setNome("Davi Dante");
g1.setSalario(10000);
Funcionario f1 = new Funcionario();
f1.setNome("Outro Davi Dante");
f1.setSalario(5000);
Funcionario ev = new EditorVideo();
ev.setNome("Mais um Davi");
ev.setSalario(2000);
ControleBonificacao controle = new ControleBonificacao();
controle.registra(g1);
controle.registra(f1);
controle.registra(ev);
System.out.println(controle.getSoma());
}
}
Classe Funcionario
public class Funcionario {
private String nome;
private String cpf;
private double salario;
public Funcionario() {
}
public double getBonificacao() {
System.out.println("Executando o método da classe FUNCIONARIO");
return this.salario * 0.05;
}
// Getters and Setters omitidos
Classe Gerente
public class Gerente extends Funcionario {
// código omitido
public double getBonificacao() {
System.out.println("Executando o método da classe GERENTE");
return super.getBonificacao() + super.getSalario();
}
}
Classe EditorVideo
public class EditorVideo extends Funcionario {
public double getBonificacao() {
System.out.println("Executando o método da classe EDITORVIDEO");
return super.getBonificacao() + 100;
}
}
Alguém poderia me ajudar a entender, por quê o programa printou a mensagem de dentro da classe Funcionario diversas vezes?