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);
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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étodoautenticaque é 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!