Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Sytem.out.println duas vezes ? (POLIMORFISMO)

Eai pessoal, tenho os seguintes códigos:

class Funcionario {
public double getBonificacao() {
        System.out.println("CHAMADA FUNCIONARIO");
        return this.salario * 0.1;
    }
}
class Gerente extends Funcionario{

    public double getBonificacao() {
        System.out.println("CHAMADA GERENTE");
        return super.getBonificacao() + super.getSalario();
    }
}
class Designer extends Funcionario{


    //REGRA BONIFICAÇÃO
    public double getBonificacao() {
        System.out.println("CHAMADA DESIGN");
        return 100;
    }
}
class EditorVideo extends Funcionario{


    //REGRA BONIFICAÇÃO

    public double getBonificacao() {
        System.out.println("CHAMADA EDITOR");
        return 300;
    }
}

E o teste de referencias:


public class TesteReferencia {

    public static void main(String[] args) {

        Designer d = new Designer();
        d.setSalario(1500);

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

        Gerente g = new Gerente();
        g.setSalario(5000);

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

        ControleBonificacao controle = new ControleBonificacao();

        controle.cadastra(d);
        controle.cadastra(e);
        controle.cadastra(g);
        controle.cadastra(f);

        System.out.println(controle.getTotal());

    }

}

A Soma esta certa, porém o system.out.println() do funcionário, aparece duas vezes. Porque ? Minha saída é a seguinte:

CHAMADA DESIGN
CHAMADA EDITOR
CHAMADA GERENTE
CHAMADA FUNCIONARIO
CHAMADA FUNCIONARIO
6120.0
3 respostas
solução!

Boa noite, Daniel! Como vai?

Intrigante, não? Mas o motivo é bem sutil!

Repare o código da classe Gerente!

class Gerente extends Funcionario{

    public double getBonificacao() {
        System.out.println("CHAMADA GERENTE");
        return super.getBonificacao() + super.getSalario();
    }
}

Veja que na última linha do método getBonificacao() vc faz uma chamada à super.getBonificação(). Nesse momento, o Java irá executar o método getBonificacao() da "classe pai" de Gerente, que nesse caso é Funcionario! E, na classe Funcionario, o método getBonificação() executa uma escrita na tela de "CHAMADA FUNCIONARIO".

Ou seja, por esse motivo, sempre que vc executar o método getBonificacao() da classe Gerente, irá ser escrito na tela:

CHAMADA GERENTE
CHAMADA FUNCIONARIO

Já a segunda aparição de "CHAMADA FUNCIONARIO" se deve ao objeto do tipo Funcionario que vc adicionou ao controle.

Compreendeu a sutiliza da questão?

EXTRA - Aprendizado para a vida: sempre que vc utilizar a palavra super no Java, vc estará se referenciando à "classe pai".

Me diga se algo não tiver ficado claro!

Grande abraço e bons estudos!

Perfeita explicação Gabriel, realmente uma sutileza que passou despercebida, grato pela excelente explicação!

Por nada, Daniel! Sempre que tiver dúvidas não hesite em recorrer ao fórum!

Grande abraço e bons estudos!