2
respostas

Resultado da execução de métodos com Polimorfismo

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?

2 respostas

Olá Davi!

Quebrei um pouquinho a cabeça pra entender o problema kkk Mas consegui, vamos lá:

Observa que o getBonificacao do Funcionario está sempre sendo executado depois da chamada de uma classe específica:

Chamando os Métodos

controle.registra(g1);
controle.registra(f1);
controle.registra(ev);

Sequência Executada

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

Separei com espaço para você visualizar esse fato. Sempre que uma classe especifica é chamada ele printa o do funcionario logo em seguida, já quando chamamos a classe funcionario diretamente só ela é printada. Por que isso acontece?

Veja, o método getBonificacao da sua classe EditorVideo e Gerente estão assim:

public double getBonificacao() {
    System.out.println("Executando o método da classe X");
    return super.getBonificacao() + 100;
 }

Quando você usa super.getBonificacao ele está chamando o método do Funcionario e é justamente por isso que ele printa toda vez que uma classe específica é criada.

Ufa, espero que tenha ajudado! kkk

Bons estudos!

Olá Guilherme!! Pois é, não foi um dúvida simples não é mesmo? Kkkk

Depois de um tempo quebrando a cabeça, eu cheguei nessa mesma conclusão: “por causa do super.getBonificacao() ele chama o método da classe EditorVideo e logo em seguida chama também o da classe Funcionário”

Eu só não entendo porque o Java faz isso... achei que o conceito de polimorfismo seria justamente pra não executar duas vezes o mesmo código...

Suponha que eu faça um insert em um banco de dados num método desse, eu teria duas linhas inseridas na minha tabela. O que seria um comportamento que eu não quero no meu sistema