A anotação @Override é como o Sharingan do Java:

👉 vê além, detecta erros escondidos e evita que você caia em armadilhas de código.

Usar @Override não é obrigatório, mas é fortemente recomendado — especialmente em herança e polimorfismo.


🧩 O que exatamente @Override faz?

Função Explicação
✔️ Confirma a sobrescrita Garante que o método existe na superclasse ou interface
⚠️ Evita erros silenciosos Identifica métodos com nome errado ou assinatura diferente
👁️ Facilita leitura e manutenção Desenvolvedores entendem imediatamente a intenção
🛡️ Protege ao refatorar Se a superclasse muda, você descobre na hora

🥷 Exemplo Naruto — com e sem @Override

✔️ Correto (com @Override)

class Ninja {
    void realizarJutsu() {
        System.out.println("Ninja realiza um jutsu genérico.");
    }
}

class Uzumaki extends Ninja {
    @Override
    void realizarJutsu() {
        System.out.println("Naruto usa Rasengan!");
    }
}

❌ Incorreto (sem Override e com erro de digitação)

class Uzumaki extends Ninja {
    void realizarjustu() {   // ERRO: nome errado!
        System.out.println("Naruto usa Rasengan!");
    }
}

Resultado:

⚠️ O método da superclasse NÃO é sobrescrito.

⚠️ O compilador não te avisa.

⚠️ O comportamento polimórfico quebra.

Assim, se você fizer:

Ninja n = new Uzumaki();
n.realizarJutsu();

➡️ Ele vai chamar o método da superclasse, não o da subclasse.

Sem @Override, você nunca saberia o porquê.