Bom dia Rodrigo, ao utilizar o @Override você não está fazendo uma sobrecarga no método, está apenas sobrescrevendo um método que está sendo herdado.
No exemplo que você passou na dúvida o resultado foi o mesmo por não ter um cálculo diferente (possivelmente), mas, se imaginar um cenário de aplicação real com esse mesmo método você já começa a ver a diferença.
Vamos supor que uma classe mãe se chame TAA (Terminal de Auto Atendimento).
public class TAA {
public boolean saca(double valor) {
double valorASacar = valor + 0.2;
return super.saca(valorASacar);
}
}
Nessa classe especificamente você tem um valor a ser sacado + 0.2 como sendo a base para todos os saques que podem ser realizados, porém cada banco que é disponibilizado para saque nesse TAA tem uma taxa diferente, embora todos tenham a função de saque, então todos vão começar a aplicar as suas taxas, para isso, eles vão sobrescrever esse método.
public class BancoDoBrasil extends TAA {
@Override
public boolean saca(double valor) {
double valorASacar = valor - 2.0;
return super.saca(valorASacar);
}
}
public class CaixaEconomica extends TAA {
@Override
public boolean saca(double valor) {
double valorASacar = valor - 5..0;
return super.saca(valorASacar);
}
}
E assim vai ser para cada banco com sua específica taxa para esse exemplo que utiliza a classe TAA como mãe. Esse é o objetivo de ter o @Override implementado, seria a adaptação de um método da classe mãe para a anecessidade da classe filha.
Já a sobrecarga é outra coisa, são vários métodos com o "mesmo" nome porém parâmetros e tipos de retorno diferentes.
Esses métodos vão utilizar um espaço diferente na memória da VM já que as assinaturas são diferentes. Entenda assinatura como o nome do método + parametros. Exemplo:
public void ovchg(){}
public void ovchg(String a){}
public void ovchg(Integer a){}
public String ovchg(String a, Integer b){return null;}
public String ovchg(Integer a, String b){return null;}
public Integer ovchg(Integer a, String b, Double c){return null;}
Note que todos os métodos acima são o mesmo, o que difere são apenas os parâmetros e tipo de retorno. Nesse momento estamos fazendo uma sobrecarga desse método ovchg.
Como dito acima, o que possibilita a sobrecarga é a assinatura dométodo, isso quer dizer então que:
public void ovchg(){}
public String ovchg(){return null;}
Não seria permitido já que a assinatura é igual, mesmo que o retorno seja diferente.
Um exemplo real que posso te dar de utilização de sobrecarga é ao criar um método de busca de dados no banco de dados. Exemplo:
public List<Bancos> procurarBancos(){
// logica para busca de todos os bancos
return listaDeTodosOsBancos;
}
public List<Bancos> procurarBancos(Integer maxResultados){
// logica para busca de todos os bancos limitando o numero max de resultados
return listaDeTodosOsBancosLimitado;
}