Рубрики
Без рубрики

Java @Переопределение – Переопределение в Java

Аннотация @переопределения Java, аннотация @переопределения в java, аннотация переопределения java, Переопределение в java, пример переопределения метода java, пример переопределения java @

Автор оригинала: 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