Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Classe getBonificacao aparentemente sendo chamada recursivamente

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;
} 

}

1 resposta
solução!

Percebi meu erro, na classe TestaReferencias() eu registro o funcionário e depois imprimo a bonificação: controle.registra(f1); System.out.println(f1.getBonificacao()); Como o método registra chama getBonificacao(), realmente ele está chamando esse método mais de uma vez.