Oi Ingrid, tudo bem?
Eu testei aqui, mas no primeiro exemplo, o método setNome()
não seria da classe Funcionário?
As classes Funcionario e Gerente devem estar assim:
Funcionario:
public class Funcionario {
private String nome;
private String cpf;
private double salario;
public double getBonificacao() {
return this.salario * 0.5;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getCpf() {
return cpf;
}
public void setCpf(String cpf) {
this.cpf = cpf;
}
public double getSalario() {
return salario;
}
public void setSalario(double salario) {
this.salario = salario;
}
}
Gerente:
public class Gerente extends Funcionario {
private int senha;
public void setSenha(int senha) {
this.senha = senha;
}
public boolean autentica(int senha) {
if(this.senha == senha) {
return true;
} else {
return false;
}
}
public double getBonificacao() {
return super.getBonificacao() + super.getSalario();
}
}
O que não deve funcionar nesse caso é usar um método próprio da classe Gerente sendo que o tipo da referência g é Funcionario. Como por exemplo o g.autentica
ou g.getBonificacao
, já que elas só estão presentes na subclasse Gerente e, portanto, fora do escopo do super classe Funcionario.
Agora, no exercício Qual é a saída?, o que acontece é que a super classe Veiculo tem o método liga()
dentro dele, dessa forma suas subclasses Moto e Carro não só herdaram esse método como também alteraram o funcionamento dele através da Sobrescrita. A partir daí é só lembrar que sempre é o método mais específico a ser chamado. Em outras palavras, o exemplo dado na primeira aula só não funcionou porque o método autentica()
foi chamado sendo que ele não existe na super classe Funcionario, diferente do liga()
que, esse sim, está presente no Veiculo.
Espero não ter dado uma explicação muito confusa, se ficou alguma dúvida é só avisar. Bons estudos!