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

[Dúvida] Instância de um Class Gerente extends Funcionario implements Autenticavel

Conforme título da dúvida, pelo exercício, temos a seguinte definição para a Class Gerente: public class Gerente extends Funcionario implements Autenticavel {...}

Na Class Gerente temos 3 métodos: setSenha, autentica e getBonificacao Na Class Funcionário temos 7 métodos: getBonificacao (abstrato), getNome, setNome, getCpf, setCpf, getSalario e setSalario Na Interface Autenticavel temos 2 métodos abstratos: setSenha e Autentica.

Ao testar, coloquei o seguinte trecho:

public class TesteReferencias {

public static void main(String[] args) {

    Autenticavel g1 = new Gerente();

    g1.setSenha(2222);

    g1.setNome("Rafael");
    g1.setSalario(5000.0);
}

}

O compilador aceita o g1.setSenha, mas não aceitou o g1.setNome e g1.setSalario. Se Auntenticavel é uma instância de Gerente, que é uma extensão de Funcionário, por quê essa referência (g1.setNome e g1.setSalario) não funciona?

2 respostas
solução!

Olá Rafael, tudo bem com você?

Realmente esse é um assunto que causa bastante confusão a primeiro momento, polimorfismo é um tanto quanto complexo.

Basicamente, quando instanciamos um objeto de uma classe, essa variável conhece apenas os métodos e atributos de sua referência. Ou seja, apesar de o g1 ser um Gerente, e por sua vez um funcionário, os métodos que ele vai reconhecer vão depender da referência ao qual ele está ligado.

Sendo assim, caso ele seja instanciado da forma

Autenticavel g1 = new Gerente();

Só será possível acessar os métodos implementados pela interface Autenticavel, que é a sua referência.

Caso seja instanciado como Funcionario

Funcionario g1 = new Gerente()

a referência de g1 vai reconhecer apenas os métodos que estão implementados na Classe Funcionario

E da mesma maneira

Gerente g1 = new Gerente()

vai fazer com que a referência reconheça todos os métodos da classe Gerente (que herda todos de Funcionario e implementa Autenticavel), sendo assim, seria a maneira mais "completa" de instanciar um objeto, pois ele vai ter todos os seus comportamentos.

No entanto, pode ser muito útil fazer uma instância polimórfica, quando queremos que objetos de diferentes tipos, mas que tenham o mesmo comportamento sejam afetados por um método, exemplo:

public void MostraNomeFuncionarios(List<Funcionario> funcionarios){
    for(Funcionario funcionario: funcionarios){
        System.out.println(funcionario.getNome());
    }
}

A classe Funcionario que tem o método GetNome(), então vai funcionar para todos os Funcionarios - tanto da classe Funcionario quanto Gerente.

No entanto, o seguinte método não funcionaria:

public void MostraSenhaFuncionarios(List<Funcionario> funcionarios){
    for(Funcionario funcionario: funcionarios){
        System.out.println(funcionario.getSenha());
    }
}

Pois quem tem o comportamento getSenha() é apenas o Gerente, e não todos objetos da classe Funcionario.

Portanto, o comportamento e atributos que podem ser utilizados de uma classe, depende a que referência o objeto está atrelado: um Autenticavel só conhece o setSenha, um Funcionario apenas setNome() e setSalario() e o único que conhece todos esses é o Gerente, que possui por herança e implementação de interface todos esses métodos!

Fico à disposição em caso de dúvidas.

Um grande abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Muito obrigado pela explicação que me ajudou muito.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software