Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Porque utilizar o @Override?

Olá,

Eu não entendi muito bem do porquê de utilizar o @Override.

Por exemplo:

@Override
public boolean saca(double valor) {
        double valorASacar = valor + 0.2;
        return super.saca(valorASacar);
    }

Pelo que eu entendi, o @Override indica ao compilador que a classe filha está sobrescrevendo aquele método, dando o resultado:

CC: 89.8

Porém, ao tirar o @Override, o resultado permanece o mesmo.

CC: 89.8

Sendo assim, ao retirar o @Override, isso seria considerado uma sobrecarga do método, ou apenas seria um novo método criado na classe filha? E como o resultado deu o mesmo, qual é a causa de se utilizar o @Override?

Obrigado!

2 respostas
solução!

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;
}

Bom dia André,

Muito obrigado pela resposta completa!