Com base no exercício dessa aula, fiz a seguinte classe TestaReferencias:
public class TestaReferencias {
public static void main(String[] args) {
Funcionario f1 = new Funcionario();
f1.setNome("Bernerdo");
f1.setSalario(2000);
Gerente g1 = new Gerente();
g1.setNome("Marcos");
g1.setSalario(5000);
EditorVideo ed = new EditorVideo();
ed.setNome("Arthur");
ed.setSalario(3000);
Designer d = new Designer();
d.setNome("Cristiane");
d.setSalario(4000);
ControleBonificacao controle = new ControleBonificacao();
System.out.println(f1.getNome());
System.out.println(f1.getSalario());
controle.registra(f1);
System.out.println(f1.getBonificacao());
System.out.println("------------------------------------");
System.out.println(g1.getNome());
System.out.println(g1.getSalario());
controle.registra(g1);
System.out.println(g1.getBonificacao());
System.out.println("------------------------------------");
System.out.println(ed.getNome());
System.out.println(ed.getSalario());
controle.registra(ed);
System.out.println(ed.getBonificacao());
System.out.println("------------------------------------");
System.out.println(d.getNome());
System.out.println(d.getSalario());
controle.registra(d);
System.out.println(d.getBonificacao());
// System.out.println("------------------------------------");
System.out.println("====================================");
System.out.print("Total de bonificação: ");
System.out.println(controle.getSoma());
}
}
O resultado impresso no console é o seguinte:
Bernerdo 2000.0 Chamando o método de bonificacao do Funcionario Chamando o método de bonificacao do Funcionario
100.0
Marcos 5000.0 Chamando o método de bonificacao do Gerente Chamando o método de bonificacao do Funcionario Chamando o método de bonificacao do Gerente Chamando o método de bonificacao do Funcionario
5250.0
Arthur 3000.0 Chamando o método de bonificacao do EditorVideo Chamando o método de bonificacao do Funcionario Chamando o método de bonificacao do EditorVideo Chamando o método de bonificacao do Funcionario
250.0
Cristiane 4000.0 Chamando o método de bonificacao do Designer Chamando o método de bonificacao do Designer
200.0
Total de bonificação: 5800.0
A criação de cada objeto é feita corretamente, inclusive o calculo de cada bonificação, bem como a totalização das bonificações. O fato estranho é que aparentemente ele chama o método getBonificacao, do próprio objeto, mas também o método de outra classe (aleatoriamente), mas não calcula a comissão 2x. Não consegui entender esse funcionamento, alguém saberia me responder?
Segue as demais classes p/ quem quiser, reproduzir o resultado:
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;
}
}
public class Funcionario {
private String nome;
private String cpf;
private double salario;
public double getBonificacao() {
System.out.println("Chamando o método de bonificacao do Funcionario");
return this.salario * 0.05;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getCpf() {
return cpf;
}
public void setCpf(String cpf) {
this.cpf = cpf;
}
public double getSalario() {
return salario;
}
public void setSalario(double salario) {
this.salario = salario;
}
}
public class Gerente extends Funcionario {
private int senha;
public void setSenha(int senha) {
this.senha = senha;
}
public boolean autentica(int senha) {
if (this.senha == senha) {
return true;
} else {
return false;
}
}
public double getBonificacao() {
System.out.println("Chamando o método de bonificacao do Gerente");
return super.getBonificacao() + getSalario();
}
}
public class EditorVideo extends Funcionario {
public double getBonificacao() {
System.out.println("Chamando o método de bonificacao do EditorVideo");
return super.getBonificacao() + 100;
}
}
public class Designer extends Funcionario {
public double getBonificacao() {
System.out.println("Chamando o método de bonificacao do Designer");
return 200;
}
}