2
respostas

Quando a referencia do mesmo tipo e a genérica trazem o mesmo resultado :0

Bom dia pessoal, tudo certo?

Eu fiz 3 instanciações (funcionário, gerente, editorvideo) onde a referencia usada é relativa ao tipo de cada objeto. Entao:

Funcionario f1 = new Funcionario(); Gerente g1 = new Gerente(); EditorVideo ev1 = new EditorVideo(); ControleBonificacao controle1 = new ControleBonificacao();

E também fiz outras 3 instaciações onde eu uso a referencia mais genérica:

Funcionário f2 = new Funcionario(); Funcionario g2 = new Gerente(); Funcionario ev2 = new EditorVideo(); ControleBonificacao controle2 = new ControleBonificacao();

Entao, de acordo com o que foi explicado no vídeo (ou pelo menos o que eu entendi), apenas deveria ser possível calcular a soma das Bonificacoes com as instancias que utilizam a referencia genérica. Porém, no meu código, eu consigo registrar e fazer a soma também com os outros objetos também (g1, f1, ev1). Por que isso está acontecendo?

Segue o código completo:

public class Gerente extends Funcionario {

    private int senha;

    public Gerente(){
        super.setSalario(1000);
    }

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

    public boolean autenticaSenha(int senha){
        if(this.senha == senha){
            System.out.println("Bem vindo");
            return true;
        } else{
            System.out.println("Senha incorreta");
            return false;
        }
    }

    public double getBonificacao(){ 
        return super.getBonificacao() + super.getSalario();
   }
public class EditorVideo extends Funcionario {

    private int senha;

    public EditorVideo(){
        super.setSalario(500.0);
    }

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

    public boolean autenticaSenha(int senha){
        if(this.senha == senha){
            System.out.println("Bem vindo");
            return true;
        } else{
            System.out.println("Senha incorreta");
            return false;
        }
    }

    public double getBonificacao(){ 
        return super.getBonificacao() + 100.0;
   }
public class ControleBonificacao {

    private double soma;

    public void registra(Funcionario f) { // SE TROCARMOS Funcionario POR Gerente ou EditorVideo, SÓ FUNCIONARÁ
        double boni = f.getBonificacao();
        this.soma += boni;
    }



    public double getSoma() {
        return soma;
    }
}
public class TesteReferencia {

    public static void main(String[] args){

        // OBJETOS COM O MESMO TIPO DE REFERENCIA:
        Funcionario f1 = new Funcionario();
        Gerente g1 = new Gerente();
        EditorVideo ev1 = new EditorVideo();
        ControleBonificacao controle1 = new ControleBonificacao();

        controle1.registra(f1);
        controle1.registra(g1);
        controle1.registra(ev1);
        System.out.println(controle1.getSoma());


        System.out.println();

        // OBJETOS COM A REFERENCIA DO TIPO MAIS GENÉRICA
        Funcionario f2 = new Funcionario();
        Funcionario g2 = new Gerente();
        Funcionario ev2 = new EditorVideo();
        ControleBonificacao controle2 = new ControleBonificacao();

        controle2.registra(f2);
        controle2.registra(g2);
        controle2.registra(ev2);
        System.out.println(controle2.getSoma());


        System.out.println();

O valor dos dois dá 1275 Porém, eu achava que nem deveria calcular a soma das bonificaçoes de g1, f1 e ev1 ...

2 respostas

Olá Rodrigo, tudo bem com você?

É possível fazer das suas formas:

  1. Usando o mesmo tipo para o objeto e para a referência Gerente g1 = new Gerente();

  2. Usando uma referência com um tipo mais genérico Funcionario g2 = new Gerente().

Ambas as formas são válidas!

Isso porque o "Gerente" HERDA de "Funcionario", o que significa que um "Gerente" É UM "Funcionario"!! E o mesmo vale para "EditorVideo".

Conclusão: como as classes "Gerente" e "EditorVideo" são funcionários, isso significa que ambas podem ser aceitas como argumentos para o método registra(Funcionario f) da classe "ControleBonificacao", já que o método aceita qualquer objeto que seja um "Funcionario" ou que herde dele.

Observação

É importante lembrar que enquanto estamos escrevendo o código (antes de executarmos o programa), o Java enxerga apenas o tipo da referência e não o que de fato foi instanciado dentro dela. Ou seja, quando escrevemos Funcionario g2 = new Gerente(), o Java vai enxergar apenas o tipo "Funcionario" e, portanto, só serão disponibilizados os métodos que foram declarados na classe "Funcionario".

Ainda levando em conta o exemplo acima: em caso de sobrescrita, onde temos o método getBonificacao() sendo implementado tanto na superclasse "Funcionario" quanto na subclasse "Gerente". Mesmo que o tipo da referência seja "Funcionario", o método a ser chamado será o mais específico. Portanto, chamaremos o getBonificacao() de "Gerente" pois é ele que, de fato, está sendo referenciado por g2.

Espero que isso te ajude. Se ficou alguma dúvida é só avisar!

Forte abraço e bons estudos!!

Boa tarde Thiago, tudo certo!

Essa parte de "referencia mais genérica" já está no próprio método "registra" , e por isso ele aceita os dois testes que eu fiz, já que todo mundo é "funcionário".

Acho que agora entendi a ideia. vlw