Что "@Override" там в java?

public class Animal {
   public void eat() { System.out.println("I eat like a generic Animal."); }

}

public class Wolf extends Animal {
   @Override
   public void eat() { System.out.println("I eat like a wolf!"); }
}

Есть ли у @Override какая-то функциональность или просто комментарий?

Ответы

Ответ 1

Из учебников по Java на annotations:

@Override - аннотация @Overrideсообщает компилятору, что элемент предназначен для переопределения элемента объявлено в суперклассе (переопределение методы будут обсуждаться в урок под названием "Интерфейсы и Наследование" ).

   // mark method as a superclass method
   // that has been overridden
   @Override 
   int overriddenMethod() { }

Хотя для этого не требуется аннотации при переопределении метода, это помогает предотвратить ошибки. Если метод, отмеченный @Override, не может правильно переопределить метод в одном из его суперклассы, компилятор генерирует ошибку.

Посмотрим на пример, указанный в спецификациях Java Language, 9.6.1.4 Override. Скажем, вы хотите переопределить метод equals в этом случае, но вы написали:

    public boolean equals(Foo that) { ... }

вместо:

    public boolean equals(Object that) { ... }

Хотя этот код является законным, аннотация объявления метода equals с помощью @Override приведет к ошибке времени компиляции, потому что вы на самом деле не переопределяете ее, вы перегружаете ее. Это может вызвать неприятные ошибки, а тип аннотации Override помогает при раннем обнаружении их.

Ответ 2

Обозначение переопределения представляет собой аннотацию времени компиляции, которая заставляет java-компилятор выдать ошибку, если метод, содержащий эту аннотацию, фактически не переопределяет метод родительского класса. Вы можете попытаться изменить класс Вольфа, чтобы не расширять класс Animal, и если присутствует аннотация Override, он покажет вам ошибку времени компиляции

Ответ 4

Он работает как комментарий, но также как утверждение о том, что вы на самом деле чем-то переопределяете. Если вы используете @Override, но на самом деле это не переопределяет, компилятор будет генерировать ошибку. Подробнее см. страницу документации.

Ответ 5

Если вы удалите метод "eat" из родительского класса или опечатаете его как "ест" в подклассе, ваш код теперь не скомпилируется. Без аннотации @Override вы можете сделать это, и ваш код все равно будет компилироваться, он просто не будет делать то, что вы хотите (а именно, переопределить метод).

Ответ 6

Во время выполнения он ничего не делает, но он помогает поймать ошибки:

Если вы считаете, что можете переопределить метод, но не можете (из-за проблемы с заданием или типами параметров), без аннотации, код будет компилироваться в нечто бесполезное (например: ваш метод не будет вызываться, но суперкласс, который вы случайно не переопределили, вызывается).