Olá!
Gostaria de saber se estou analisando corretamente o código, pois surgiu uma dúvida ao final do meu raciocínio e não consegui resolver.
Meu raciocínio é o seguinte:
No SistemaInterno, é criado um método público (public) sem retorno (void) chamado "autentica", tendo como parâmetro de entrada uma variável local "fa" que precisa ter a interface "Autenticável". Conclui isso dessa parte do código:
public void autentica(Autenticavel fa) {
Dado que toda interface possui apenas métodos com empty bodies, a entrada precisa ter um override dos métodos da interface "Autenticável". Esses métodos são:
public abstract void setSenha(int senha) ;
public abstract boolean autentica(int senha) ;
Sendo assim, e dado que Gerentes e Administradores implementam tanto o "setSenha" quanto o "autentica" (ou seja, há uma reescrita, usando as mesmas assinaturas, mas com corpo), Gerentes e Administradores são uma entrada possível do "public void autentica(Autenticavel fa)" do SistemaInterno.
Depois disso, há uma comparação entre a senha do objeto do tipo "Autenticável" que está na referência "fa" com o valor true or false de uma variável booleana:
boolean autenticou = fa.autentica(this.senha);
if (autenticou) {
System.out.println("Pode entrar no sistema");
} else {
System.out.println("Não pode entrar no sistema");
Por fim, no TesteSistema, temos:
SistemaInterno si = new SistemaInterno();
si.autentica(g);
O "autentica", nesse caso, parece chamar tanto o método do SistemaInterno quanto o seguinte método do Gerente:
@Override
public boolean autentica(int senha){
if(this.senha == senha){
return true;
} else {
return false;
Como o "si.autentica(g)" chama, ao mesmo tempo, tanto o "autentica" do Gerente quanto o "autentica" do SistemaInterno e compara os dois, se foi feita apenas uma chamada, e que não parece relacionar os dois explicitamente?
Ainda: pelo o que vimos em polimorfismo, não deveria ocorrer apenas o método mais específico?
E qual tópico devo estudar melhor para entender mais intuitivamente essa minha dúvida?
Obrigado!