Ответы:
@ Override изначально не было в языке. Когда возникла необходимость добавить его, было проще использовать общий механизм (аннотации), чем добавить новое ключевое слово в язык. Добавление нового ключевого слова всегда является несовместимым изменением, поскольку оно может нарушить работу программ, которые используют эти слова в качестве идентификатора.
В языках, которые добавляют маркер переопределения прямо с первого дня, это довольно часто ключевое слово (например, Kotlin и Scala), в Java это было вопросом обратной совместимости со старой версией Java, которая не имела маркера переопределения.
default
уже было зарезервированным ключевым словом (используемым в выражениях switch) - они просто добавили новое использование для него. Есть также несколько ключевых слов, которые ничего не делают прямо сейчас, но зарезервированы для будущего использования (const, goto) - см. JLS § 3.9
enum
что добавленное ключевое слово сломало бы старый код. Другие ключевые слова здесь: stackoverflow.com/questions/16506411
Вам не нужна аннотация @Override, чтобы фактически переопределить поведение; Это аннотация, потому что она просто добавляет некоторый контекст намерения метода для компилятора, а не изменяет сам метод.
Без аннотаций, вы можете намереваться функциональности переопределения, но случайно не в состоянии сделать это (используя несколько иную подпись). Добавление аннотации говорит компилятору сгенерировать ошибку, если этот метод на самом деле не переопределяет поведение.
Таким образом, это имеет смысл в качестве аннотации.