Risposte:
@Override non era originariamente nella lingua. Quando si sentiva la necessità di aggiungerlo, era più facile usare un meccanismo generico (annotazioni) che aggiungere una nuova parola chiave alla lingua. L'aggiunta di una nuova parola chiave è sempre una modifica incompatibile poiché può interrompere i programmi che utilizzano tali parole come identificatore.
Nelle lingue che aggiungono un marcatore di override fin dal primo giorno, è abbastanza spesso una parola chiave (esempi sono Kotlin e Scala), in Java si trattava di rimanere retrocompatibile con la versione precedente di Java che non aveva alcun marcatore di override.
default
era già una parola chiave riservata (utilizzata nelle istruzioni switch) - hanno appena aggiunto un nuovo uso. Ci sono anche alcune parole chiave che non fanno nulla in questo momento ma sono riservate per un uso futuro (const, goto) - vedi JLS §3.9
enum
parola chiave aggiunta avrebbe spezzato il codice precedente. Più rompendo le parole chiave qui: stackoverflow.com/questions/16506411
Non è necessaria l' annotazione @Override per sovrascrivere effettivamente il comportamento; È un'annotazione perché sta semplicemente aggiungendo un contesto dell'intento del metodo per il compilatore, non modificando il metodo stesso.
Senza l'annotazione, si può intendere alla funzionalità di override, ma accidentalmente non riuscire a farlo (utilizzando una firma leggermente diverso). L'aggiunta dell'annotazione indica al compilatore di generare un errore se questo metodo non sta effettivamente ignorando il comportamento.
Come tale, ha perfettamente senso come un'annotazione.