1
resposta

Anotação @Override não funciona!

Olá developers! Já faz algum tempo que tenho notado que a annotation @Override não funciona. Não liguei muito, afinal meu código está funcionando 100% mas me bateu uma curiosidade do porquê disso. Alguém sabe me responder? Segue código abaixo:

public class Teste {

    public static void main(String[] args) {
         Conta cc1 = new ContaCorrente(22, 33);
         Cliente clienteCC1 = new Cliente();
         clienteCC1.setNome("Nico");
         cc1.setTitular(clienteCC1);
         cc1.deposita(333.0);

         Conta cc2 = new ContaPoupanca(22, 44);
         Cliente clienteCC2 = new Cliente();
         clienteCC2.setNome("Guilherme");
         cc2.setTitular(clienteCC2);
         cc2.deposita(444.0);

         Conta cc3 = new ContaCorrente(22, 11);
         Cliente clienteCC3 = new Cliente();
         clienteCC3.setNome("Paulo");
         cc3.setTitular(clienteCC3);
         cc3.deposita(111.0);

         Conta cc4 = new ContaPoupanca(22, 22);
         Cliente clienteCC4 = new Cliente();
         clienteCC4.setNome("Ana");
         cc4.setTitular(clienteCC4);
         cc4.deposita(222.0);

         List<Conta> lista = new ArrayList<Conta>();
         lista.add(cc1);
         lista.add(cc2);
         lista.add(cc3);
         lista.add(cc4);

        lista.sort(new Comparator<Conta>(){
//        Antiga classe NumeroDaContaComparator2, porém definido como classe anônima;

       @Override //não funciona
        public int compare(Conta c1, Conta c2) {
        return Integer.compare(c1.getNumero(), c2.getNumero());
                }
            }
         );

        Comparator<Conta> comp = new Comparator<Conta>(){
//      Antiga classe NumeroDaContaComparator2, porém definido como classe anônima;            

    @Overrride // não funciona;       
     public int compare(Conta c1, Conta c2) {    

        String nomeC1 = c1.getTitular().getNome();
        String nomeC2 = c2.getTitular().getNome();
        return nomeC1.compareTo(nomeC2);    
            }
        };

// Laço que traz as contas;         
         for (Conta conta : lista) System.out.println(conta + ", " 
         + conta.getTitular().getNome());
    }
}

Obrigado desde já! :)

1 resposta

A anotação @Override é usada quando substituímos um método na subclasse usando herança. No cenário que você enviou sua classe Teste não usa herança, por isso não funciona o @Override.

Exemplo com Override:

class ParentClass
{
    public void displayMethod(String msg){
        System.out.println(msg);
    }
}
class SubClass extends ParentClass
{
    @Override
    public void displayMethod(String msg){
        System.out.println("Message is: "+ msg);
    }
    public static void main(String args[]){
        SubClass obj = new SubClass();
        obj.displayMethod("Hey!!");
    }
}

No exemplo acima, estamos substituindo um método displaymethod() na classe filha. Mesmo se não usarmos a anotação @Override, o programa ainda funcionará sem problemas. Então, por que usar essa anotação @Override?

1) Se o programador cometer algum erro, como nome do método errado, tipos de parâmetros incorretos, você receberá um erro de tempo de compilação. Usando esta anotação, você instrui o compilador que está substituindo esse método. Se você não usar a anotação, o método da subclasse se comportaria como um novo método (não o método de substituição) na subclasse.

2) Melhora a legibilidade do código. Portanto, se você alterar a assinatura do método substituído, todas as subclasses que substituem o método específico geram um erro de compilação, o que acabaria por ajudá-lo a alterar a assinatura nas subclasses. Se você tiver muitas classes, essa anotação realmente o ajudará a identificar as classes que requerem alterações quando você altera a assinatura de um método.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software