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

Duvida em polimorfismo

Olá pessoal! Bem estou com duvidas em uma sintaxe que ao meu ver é bem assustadora. rs

Eis a duvida:

se eu tenho o seguinte codigo:

Funcionario f = new Funcionario();
Funcionario a = new Gerente();

Eu entendi o motivo do Funcionario a esquerda da variável a, mas a questão é:

Em meus testes eu percebi que ao chamar métodos com a, como:

a.getBonificacao();

eu tenho o retorno pertencente a classe Gerente, e não a que está em funcinario. Entretanto, só consigo chamar métodos que existam tanto em gerente quanto em funcionario.

Por exemplo, eu criei o método apenas na classe Gerente

    public void teste () {
        System.out.println("Gerente");
    }

E eu não consigo fazer a.teste();

Visto que para chamar métodos em a, mesmo essa variável sendo um Gerente, os métodos precisam existir em sua classe mãe. Estou correto? porque isso ainda parece um pouco confuso para mim.

Contextualizando para galera que não está fazendo o curso Java parte 3, a classe Gerente é uma extensão de Funcionário.

Desde já agradeço pessoal :)

6 respostas
Funcionario f = new Funcionario();
Funcionario a = new Gerente();

f é uma instância do objeto Funcionario(). Funcionario() é uma superclasse.

a é uma instância do objeto Gerente(). Gerente() é uma subclasse de Funcionario() e por isso, tem herança da superclasse.

Por que? Porque todo Gerente também é um funcionário. Logo, criando o objeto Gerente() permite chamar médodos dentro de Funcionario().

Então veja assim:

f não consegue ver nada dentro de Gerente() pq ele não é gerente.

a consegue ver tudo dentro de funcionário pq ele é gerente. E gerente É funcionário.

 

Então, você pode chamar métodos em Gerente() e em Funcionarios() a partir de gerente, já que Gerente() é uma sub classe de Funcionarios()

 

Vamos confirmar o código, certo?

public class TestaGerente {

    public static void main(String[] args) {
        Gerente m1 = new Gerente();
        m1.teste();
    }
}

m1 é como você passa a referenciar o objeto Gerente()

digamos q você tem um método chamado getSalario em funcionario() e getBonus() em gerente. Ao criar o objeto Gerente(), esses gets existem para você passa a poder acessar eles.

    System.out.println(m1.getSalario()+" de salario e " +m1.getBonus()+" de bonus.");

se o salário do gerente é 5000.0, logo, o console tem que responder:

5000.0 de salario e 5000.0 de bonus

Entendi Gustavo, obrigado. mas ao declarar a com a sintaxe:

Funcionario a = new Gerente();

Eu não cosigo chamar métodos específicos do gerente, correto? apenas os herdadados pela superclass ou que foram reescritos.

Simm, Gustavo, é exatamente isso. Uma vez que a é do tipo Funcionario e possui a referência para um objeto do tipo Gerente, ela pode acessar somente métodos de Funcionario() ou os que foram reescritos de Funcionario() em Gerente().

Gustavo, lembre-se, a direita define a esquerda. a classe Gerente extends Funcionario (ou alguma classe herdada de funcionario) ?

se sim, então a vai iniciar todos os métodos em funcionário e em gerente.

solução!

Em alguns casos podemos querer mesmo que o Tipo da classe seja o pai, mas ainda sim queremos acessar um método especifico do filho que foi passado de alguma forma no parâmetro de algum método, por exemplo:

public void metodoQualquer(Funcionario a){
     ((Gerente)a).teste();
}

ou seja mesmo o Java acessando somente do Tipo explicito, ainda sim internamente o compilador sabe que ele veio de uma outra classe,

System.out.println("Nome da classe" + f.getClass().getCanonicalName());
System.out.println("Nome da classe" + a.getClass().getCanonicalName());

Esse tipo de abordagem é comum quando estamos implementando filtros em Servlets, onde o Framework pode injetar um tipo diferente do que esperamos, ai forçamos o cast desse jeito.

Valeu pessoal, consegui sanar minha duvida. =)