Java Аннотации были введены в Java версии 1.5 и на данный момент аннотация @Override
представляет собой одну из встроенных Java-аннотаций. Когда мы применяем эту аннотацию к методу, то это сообщает компилятору, что мы пытаемся переопределить метод суперкласса.
Давайте посмотрим простой пример переопределения метода в Java.
MainClass.java
1 2 3 4 5 6 7 8 9 |
package ua.com.prologistic; public class MainClass { public void doSomething(String str){ System.out.println("Метод класса MainClass : " + str); } } |
Теперь давайте создадим подкласс и переопределеним метод doSomething(String str)
класса MainClass
.
ChildClass.java
1 2 3 4 5 6 7 8 9 10 |
package ua.com.prologistic; public class ChildClass extends MainClass{ //@Override public void doSomething(String str){ System.out.println("Вызов в дочернем классе : " + str); } } |
Обратите внимание, что на примере выше @Override
аннотация закомментирована.
Теперь давайте создадим тестовый класс, чтобы проверить переопределение в работе.
OverrideTest.java
1 2 3 4 5 6 7 8 9 10 |
package ua.com.prologistic; public class OverrideTest { public static void main(String[] args) { MainClass mc = new ChildClass(); mc.doSomething("Переопределили"); } } |
Результат выполнения программы:
1 |
Вызов в дочернем классе : Переопределили |
Здесь объект mc имеет тип MainClass
, но во время выполнения это объект класса ChildClass
, поэтому, когда мы вызываем метод doSomething(String str)
, Java ищет реализацию в ChildClass
и выводит её на экран.
Теперь давайте изменим метод doSomething(String str)
класса MainClass
, как показано ниже:
1 2 3 4 |
//Изменили аргумент со String на Object public void doSomething(Object str){ System.out.println("Метод класса MainClass : " + str); } |
В данном случае компилятор не выдаст никаких предупреждений или ошибок. Результатом выполнения этой программы будет:
1 |
Метод класса MainClass : Переопределили |
Причина в том, что метод MainClass doSomething(Object str)
больше не переопределяется классом ChildClass
и, следовательно, идет вызов реализации MainClass
.
Если вы раскомментировать аннотацию @Override
в ChildClass
, то получите следующее сообщение об ошибке компиляции:
1 Метод doSomething(String) класса ChildClass должен переопределить или реализовать метод суперкласса
Лучше решать такие проблемы во время компиляции, а не во время работы программы. Поэтому всегда используйте аннотацию @Override
, когда вы пытаетесь переопределить метода суперкласса.