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

Na aula aplicando polimorfismo no console o resultado é mostrado duplicado

Fiz o teste de colocar em meu codigo o sysout para poder ver se realmente estava chamando o metodo correto, mas ao executar o TestaReferencia o console traz o código duplicado, mostrando a menssagem do gerente e do funcionario.

O resultado do console --- Darlan de Sousa Chamando o metodo do gerente Chamando o metodo do Funcionario Chamando o metodo do Funcionario Chamando metodo do Editor Chamando o metodo do Funcionario

public class TesteReferencias {

    public static void main(String[] args) {

        Gerente g = new Gerente ();
        g.setNome("Darlan de Sousa");
        System.out.println(g.getNome());
        g.setSalario(5000);

        Funcionario f = new Funcionario();
        f.setSalario(2000);

        EditorVideo e = new EditorVideo();
        e.setSalario(2500);

        ControleBonificacao c = new ControleBonificacao();
        c.registro(g);
        c.registro(f);
        c.registro(e);

        System.out.println(c.getSoma());
    }

}

public class Gerente extends Funcionario {

    private int senha;


    public Gerente() {

    }

    public void setSenha(int senha) {
        this.senha = senha;
    }

    public boolean autentica(int senha) {
        if (this.senha == senha) {
            return true;
        }
        return false;
    }

    public double getBonificacao() {
        System.out.println("Chamando o metodo do gerente");
        return super.getBonificacao() + super.getSalario();

    }

}
public class Funcionario {

    private String nome;
    private String cpf;
    private double salario;


    public Funcionario() {

    }

    public double getBonificacao() {
        System.out.println("Chamando o metodo 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 ControleBonificacao {

    private double soma;

    public void registro(Funcionario f) {

        double boni = f.getBonificacao();
        this.soma = this.soma + boni;

    }

    public double getSoma() {
        return soma;
    }

}

public class EditorVideo extends Funcionario{

    public double getBonificacao() {
        System.out.println("Chamando metodo do Editor");
        return super.getBonificacao() + 100;

    }
}
1 resposta
solução!

Oi Darlan! Tudo bom?

Isso está acontecendo porque você colocou o sysout também no método getBonificacao da classe Funcionario. Repara que na aula o professor não colocou esse sysout.

Quando você passa o gerente como parâmetro para o método registro, ele vai chamar o getBonificacao do Gerente que vai imprimir "Chamando o método do Gerente". Só que na linha seguinte, o próprio getBonificacao do Gerente chama o getBonificacao da classe mãe (super), que é a classe Funcionario. Por isso, em seguida ele vai imprimir também o sysout que você colocou no getBonificacao de Funcionario.

No próximo registro é passado um Funcionario. Então ele vai direto para o getBonificacao da classe Funcionario e vai imprimir mais uma vez o "Chamando o método do Funcionário".

No último registro é passado um editor e vai acontecer o mesmo que aconteceu com gerente. Vai chamar o getBonificacao da classe EditorVideo que vai imprimir o sysout para o método do Editor, mas em seguida vai chamar o getBonificacao da classe mãe e imprimir o sysout do Funcionário.

Espero ter ajudado.