Автор оригинала: Pankaj Kumar.
Переопределение-очень популярная концепция в языках программирования. Переопределение метода в Java-это тот случай, когда у нас есть один и тот же метод, присутствующий как в суперклассе, так и в подклассе. Это одна из концепций OOPS для реализации полиморфизма времени выполнения в Java.
Переопределение в Java
Давайте посмотрим, как мы обычно переопределяем метод в java.
package com.journaldev.annotations; public class BaseClass { public void doSomething(String str){ System.out.println("Base impl:"+str); } }
Теперь мы создадим подкласс, переопределяющий базовый класс doSomething
метод.
package com.journaldev.annotations; public class ChildClass extends BaseClass{ public void doSomething(String str){ System.out.println("Child impl:"+str); } }
Теперь давайте создадим тестовый класс, чтобы проверить, как переопределение работает в java.
package com.journaldev.annotations; public class OverrideTest { public static void main(String[] args) { BaseClass bc = new ChildClass(); bc.doSomething("override"); } }
Результатом работы вышеуказанной программы является:
Child impl:override
Как Работает Переопределение Java?
- Сигнатура метода должна быть точно такой же в суперклассе и подклассе.
- При создании экземпляра необходимо использовать подкласс конструктор .
- Во время компиляции переменная ссылается на суперкласс. Однако во время выполнения он ссылается на объект подкласса.
- Когда метод вызывается для переменной, похоже, что будет вызван метод суперкласса. Но метод присутствует в объекте подкласса, поэтому он и называется.
Здесь “bc” относится к базовому классу типа, но во время выполнения это объект дочернего класса. Поэтому, когда мы вызываем его метод doSomething(String str)
, он ищет метод в дочернем классе и, следовательно, вывод.
Будет ли переопределение Java работать с другой сигнатурой метода?
Теперь давайте изменим метод doSomething базового класса, как показано ниже.
//Change argument from String to Object public void doSomething(Object str){ System.out.println("Base impl:"+str); }
Вы заметите, что компилятор не будет выдавать никаких предупреждений/ошибок, и теперь, если вы запустите тестовую программу, вывод будет;
Base impl:override
Причина в том, что базовый класс doSomething(Object str)
метод больше не переопределяется дочерним классом. Следовательно, он вызывает реализацию базового класса. Дочерний класс перегружает метод doSomething() в этом случае, потому что имя метода то же самое, но подпись метода отличается.
Аннотация Java @Переопределения
Java 1.5 представила аннотации . Java @Переопределение
аннотация является одной из аннотаций java по умолчанию. Когда мы используем эту аннотацию для метода, она сообщает компилятору, что мы пытаемся переопределить метод суперкласса.
Если вы раскомментируете аннотацию @Override в дочернем классе, вы получите следующее сообщение об ошибке во время компиляции:
The method doSomething(String) of type ChildClass must override or implement a supertype method
Преимущества аннотации Java @переопределения
- Аннотация Java @Override гарантирует, что любые изменения суперкласса в сигнатуре метода приведут к ошибке во время компиляции, и вам придется внести необходимые изменения, чтобы убедиться, что классы работают должным образом.
- Лучше решать потенциальные проблемы во время компиляции, чем во время выполнения. Поэтому всегда используйте аннотацию java @Override всякий раз, когда вы пытаетесь переопределить метод суперкласса.
Переопределение против перегрузки
Переопределение происходит между суперклассом и подклассом | Перегрузка присутствует в том же классе |
Сигнатура метода должна быть одинаковой в суперклассе и подклассе. | Имя метода должно быть одинаковым, но подпись метода должна отличаться. |
Идентификация вызываемого метода происходит во время выполнения. | Мы можем определить метод, который будет вызван во время компиляции. |
Если переопределение прерывается, это может иметь неблагоприятные последствия, поскольку программа будет скомпилирована и запущена. Однако метод из суперкласса будет вызван, а не из подкласса. | Если мы изменим имя метода, чтобы прервать перегрузку, ошибка возникнет во время компиляции. Так что это легко исправить и не причиняет большого вреда. |
Переопределение также называется полиморфизмом во время выполнения. | Перегрузка называется полиморфизмом во время компиляции. |
Резюме
Переопределение в Java очень популярно, и вы можете найти много примеров в самом JDK. В основном он присутствует там, где у нас есть базовый класс с реализацией метода по умолчанию, а затем подкласс, переопределяющий его и реализующий его.
Ссылка: Документация Oracle