Analise a classe a seguir retirada de uma aplicação Java que...
package geral;
public class Diarista extends Empregado{
private int diasTrabalhados;
public Diarista(int diasTrabalhados, int id, String nome, double valorReferencia) {
super(id, nome, valorReferencia);
this.diasTrabalhados = diasTrabalhados;
}
public int getDiasTrabalhados() {
return diasTrabalhados;
}
public void setDiasTrabalhados(int diasTrabalhados) {
this.diasTrabalhados = diasTrabalhados;
}
@Override
public double obterSalario(){
return super.getValorReferencia() * diasTrabalhados;
}
public double obterSalario(double percentualAcrescimo){
double salario= this.obterSalario();
double salarioReajustado = salario + salario * percentualAcrescimo /100;
return salarioReajustado;
}
public double obterSalario(double adicional, double desconto){
return this.obterSalario() + adicional - desconto;
}
}
Analisando o código apresentado é possível concluir que
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Alternativa correta: B - o método obterSalario() foi sobrescrito da classe Empregado.
Vamos discutir o conceito aplicado na questão e entender por que essa alternativa é a correta. O código apresentado exemplifica o uso de herança e polimorfismo na linguagem de programação Java. A classe Diarista estende a classe Empregado, o que significa que Diarista herda os atributos e métodos da classe Empregado, mas também pode definir seus próprios métodos ou sobrescrever os existentes.
O conceito de sobrescrita de métodos (ou method overriding), que é central para essa questão, ocorre quando uma subclasse define um método que já existe na superclasse. Neste caso, o método obterSalario() da classe Diarista é uma sobrescrita do método com o mesmo nome na classe Empregado. A anotação @Override é uma dica para o compilador e para outros desenvolvedores de que o método é uma sobrescrita intencional de um método da superclasse.
A sobrescrita permite que a classe Diarista forneça sua própria implementação para o cálculo do salário, que leva em consideração os diasTrabalhados, um atributo específico da classe Diarista. Isto é diferente do que poderia estar definido na classe Empregado, permitindo assim comportamentos especializados de acordo com o tipo de empregado.
A instrução super(id, nome, valorReferencia);
é um chamado ao construtor da superclasse Empregado, que inicializa os atributos herdados. Esta chamada é obrigatória quando a superclasse não possui um construtor padrão (sem argumentos) e espera que determinados valores sejam inicializados ao criar um objeto da subclasse.
Por fim, é importante notar que a existência de métodos com o mesmo nome, mas diferentes listas de parâmetros (como obterSalario() e obterSalario(double percentualAcrescimo)) é, na verdade, um exemplo de sobrecarga de métodos (ou method overloading), e não sobrescrita. A sobrecarga permite que vários métodos com o mesmo nome coexistam, desde que eles tenham assinaturas únicas (ou seja, diferentes parâmetros).
Portanto, a alternativa B está correta porque indica corretamente que o método obterSalario() foi sobrescrito na classe Diarista para refletir o cálculo do salário específico para essa subclasse, que é diferente do cálculo para outros tipos de empregados que podem estar definidos na superclasse Empregado.
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo
Comentários
Veja os comentários dos nossos alunos
a) Alternativa ERRADA. É possível criar diversos métodos com o mesmo nome, contanto que seus parâmetros sejam diferentes (na linguagem mais correta, equivale a dizer contanto que sua assinatura seja diferente). Esse conceito em Orientação a Objetos chama-se sobrecarga.
b) Alternativa CORRETA. A classe Diarista estende a classe Empregado, que no exemplo podemos assumir que já possuia seu próprio método obterSalario(). Através da anotação @Override é explicitado que seu comportamento deve ser sobrescrito pelo da sub-classe (Diarista).
c) Alternativa ERRADA. A instrução super passa estes valores para o construtor da super-classe (Empregado).
d) Alternativa ERRADA. A instrução super.getValorReferencia() chama esse método da super-classe (Empregado.java), e não da classe Start.java.
e) Alternativa ERRADA. Não confundir sobrescrita (@Override) com sobrecarga (conceito explicado acima).
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo