No caso abaixo, apesar da ref. ser Funcionário o objeto não é do tipo gerente? Sendo assim o Gerente tem o método invocado e deveria compilar normalmente?
Funcionario f = new Gerente();
f.autentica(1234);
No caso abaixo, apesar da ref. ser Funcionário o objeto não é do tipo gerente? Sendo assim o Gerente tem o método invocado e deveria compilar normalmente?
Funcionario f = new Gerente();
f.autentica(1234);
Faz sentido, Diego, porém vamos dar uma olhada na estrutura criada:
class Funcionario {
// metodos do funcionario
}
class Gerente extends Funcionario {
public void autentica(int valor) {
//....
}
//Outros métodos exclusivos do gerente
}
Ao fazermos...
Funcionario f = new Gerente();
f.autentica(1234);
... o compilador vai "toscamente" olhar a linha f.autentica(1234)
para responder a seguinte pergunta:
"O tipo da referência
f
(classeFuncionario
) possui o métodoautentica
que é público e recebe um parâmetro inteiro?"
Como essa pergunta possui uma resposta negativa (afinal de contas, o método não está no tipo Funcionario
) há um erro de compilação.
Então, respondendo sua pergunta inicial:
"apesar da ref. ser Funcionário o objeto não é do tipo gerente?"
Sim. O objeto é do tipo Gerente
, porém ao chegar na linha abaixo, o compilador verificará que referência f
não possui o método chamado, disparando um erro.
Abraço!