Pedro,
Para complementar as outras respostas. A sobrescrita de métodos é quando estamos trabalhando com orientação a objetos e temos uma classe (filha) que acaba herdando de uma outra classe(mãe). Caso a classe filha precise modificar algum comportamento herdado da classe mãe, podemos fazer uma sobrescrita do método diretamente da classe filha. Exemplo:
public class Funcionario {
protected String nome;
protected String cpf;
protected double salario;
public double calculaBonus() {
return salario * 0.10;
}
}
public class Gerente extends Funcionario {
String setor;
@Override
public double calculaBonus() {
return this.salario * 0.20;
}
}
Nesse exemplo temos a classe Funcionario
onde tem suas características e um método para calcular o bônus, onde é o salário + 10%, mas temos que representar um Gerente, que possui as mesmas características de um funcionário, mas pode existir diferenças em alguns comportamentos. Nesse exemplo, a classe Gerente
vai herdar todos os atributos e métodos da Funcionario
e também terá uma característica a mais, que é o setor, mas o cálculo do bonus de Gerente é diferente, pois não é apenas 10%, são 20%. Dessa forma, conseguimos fazer a sobrescrita do método calculaBonus()
herdado de Funcionário
e modificar seu comportamento.
Sobre a sua dúvida de qual versão do método será executado, caso eu instancie um objeto do tipo Gerente e chame o método calculaBonus()
, será executado o método da classe Gerente e não da funcionário, pois eu realizei a sobrescrita desse método. Exemplo:
Gerente gerente = new Gerente();
gerente.salario = 1000;
System.out.println(gerente.calculaBonus());
Irá retornar 200, pois foi executado o calculaBonus()
da classe Gerente
. Lembrando que quando realizamos a sobrescrita do método, deve ser a mesma assinatura do método original, ou seja, mesmo tipo de retorno, nome, quantidade de parâmetros e etc.
A sobrecarga de métodos é quando temos vários métodos com o mesmo nome, mas com retornos e parâmetros diferentes. Exemplo:
public class Calculadora {
public int soma(int num1, int num2) {
return num1 + num2;
}
public double soma(double num1, double num2) {
return num1 + num2;
}
}
Dessa forma, evitamos ficar poluindo o nosso código com nomes de métodos desnecessários, como double somaDouble(double num1, double num2)
, int somaInt(int num1, int num2)
e só variamos os parâmetros que recebemos e o retorno, mas continuamos a utilizar o mesmo nome.
Espero ter ajudado. Bons estudos.