java override method overriding
Цей підручник пояснює, як досягти поліморфізму виконання в Java, використовуючи заміщення методів та анотацію @override, на простих прикладах:
Ми вже детально обговорювали концепцію поліморфізму та поліморфізм компіляції. У цьому посібнику ми продовжимо поліморфізм середовища виконання в Java.
На відміну від поліморфізму під час компіляції, при якому виклик методу вирішується під час компіляції, у поліморфізмі середовища виконання виклик методу вирішується під час виконання.
=> Перевірте ВСІ підручники Java тут.
Що ви дізнаєтесь:
- Поліморфізм часу виконання на Java
- Анотація @override в Java
- Перевантаження та заміна в Java
- Висновок
Поліморфізм часу виконання на Java
Поліморфізм часу виконання, який також відомий як динамічний поліморфізм або Динамічний метод відправлення є техніка, при якій перевизначений виклик методу динамічно вирішується під час виконання.
Поліморфізм виконання під час роботи в Java досягається за допомогою “ перевизначення методу '. Заміна методу - це техніка, за допомогою якої метод у батьківському класі перевизначається або перевизначається в дочірньому класі.
Коли метод замінений у класі, техніка динамічного відправлення методу вирішує перевизначений виклик методу під час виконання, а не під час компіляції.
Досягнення поліморфізму виконання в Java - перевизначення методу
Перевизначення методу - це підхід, який ми використовуємо для досягнення поліморфізму виконання в Java. Як уже зазначалося, перевизначення методу - це техніка, при якій підклас додає метод, який вже присутній у його батьківському класі, і додає нову функціональність до цього методу. Тоді ми говоримо, що метод базового класу замінений.
Новий метод, який ми визначили в підкласі з тим самим прототипом, що і метод батьківського класу, але різною реалізацією, називається “ метод заміщення ' . Метод у батьківському класі відомий як “ Перевизначений метод '.
Запитання та відповіді для співпраці з Oracle DBA
Після перевизначення методу залишається питання про те, як вирішується виклик цього перевизначеного методу?
Зазвичай ми викликаємо замінений метод через посилання базового класу. Ми створимо посилання на тип бази, а потім призначимо об’єкт дочірнього класу, використовуючи нове ключове слово.
Таким чином, це залежить від вмісту посилальної змінної або того, на який об'єкт посилається посилання на базовий клас, що визначає, який метод слід викликати. Отже, якщо об’єкти посилання вказують на об’єкт дочірнього класу, тоді викликається метод заміщення.
В іншому випадку, якщо об'єкт посилання містить об'єкт базового класу, тоді викликається перевизначений метод. Однією з тем, яку ми повинні чітко зрозуміти в поліморфізмі середовища виконання, особливо для динамічного відправлення методів, є “оновлення”, що пояснюється нижче.
Upcasting
Коли посилальний об'єкт батьківського класу, про який ми говорили вище, вказує на об'єкт підкласу або посилається на нього, тоді ми називаємо його Upcasting.
Давайте розберемося з оновленням на простому прикладі.
Врахуйте, що у нас є клас «BaseClass», і ми розширюємо цей BaseClass, щоб створити новий клас DerivedClass. Ця структура виглядає так, як показано нижче.
class BaseClass { ….//BaseClass code here } class DerivedClass extends BaseClass{ ….//DerivedClass code here }
Тепер для реалізації оновлення ми оголосимо посилальну змінну типу BaseClass. Далі ми призначаємо об’єкт DerivedClass до посилання класу BaseClass, як це зроблено в наведеному нижче операторі коду.
BaseClass base = new DerivedClass (); //Upcasting
Тож тут ми можемо сказати, що ми підвищили об’єкт DerivedClass до BaseClass. Що стосується поліморфізму виконання, концепція оновлення дуже важлива.
Отже, загалом оновлення - це процес присвоєння дочірніх об’єктів або об’єктів підкласу посилання батьківського чи суперкласу.
SuperClass reference = new Subclass Object;
Програма Java нижче демонструє перевизначення методу, а також показує, як виконується оновлення для вирішення перевизначених викликів методів під час виконання.
//base/parent class class Parent { void Print() //print method { System.out.println('Parent::Print() method'); } } //child class 1 inheriting from Parent class child1 extends Parent { void Print() //overridden print method { System.out.println('child1::Print() method'); } } //child class 2 inheriting from Parent class child2 extends Parent { void Print() //overridden print method { System.out.println('child2::Print() method'); } } class Main { public static void main(String() args) { Parent parent = new Parent(); parent.Print(); //executes parent Print () method parent = new child1(); //upcasting parent.Print(); //executes child1 Print () method parent = new child2(); //upcasting parent.Print(); //executes child2 Print () method
Вихід:
У наведеній вище програмі ми маємо два класи, тобто child1 та child2, які обидва походять від класу ‘Parent’. Батьківський клас має метод «Друк», який замінено як у класах child1, так і child2. Тоді в основному методі ми створюємо посилальний об’єкт батьківського класу з назвою ‘батьківський’.
Спочатку ми призначаємо йому об’єкт класу Parent, а потім викликаємо метод “Print ()“. Потім ми повторюємо це, призначаючи спочатку об'єкт child1, а потім об'єкт child2 для посилання Parent.
що означає невизначене посилання в C ++
Результат показує, залежно від вмісту батьківського посилання, і викликається відповідний метод Друк.
Переваги динамічного / тривалого поліморфізму
- При динамічному поліморфізмі програмісту дозволяється замінювати методи.
- Це дозволяє класам визначати метод із загальною реалізацією, який його похідні можуть потім замінити, і забезпечити конкретну реалізацію.
- З динамічним відправленням методу виклик методу вирішується під час виконання, на відміну від перевантаження, яке вирішується під час компіляції. Це забезпечує більшу гнучкість для програмістів.
Оскільки поліморфізм часу виконання прив’язує відповідний метод до виклику під час виконання, і ми також його називаємо динамічне прив'язка або пізнє прив'язка . Поліморфізм компіляції, з іншого боку, підтримує статичне зв’язування або раннє зв’язування .
Статичне проти динамічного прив'язки
Статична прив'язка | Динамічне прив'язка |
---|---|
Виклик методу, вирішений під час компіляції, є статичним прив'язуванням. | Виклик методу, вирішений під час виконання, є динамічним прив'язуванням. |
Перевантаження методу є прикладом статичного прив'язки. | Перевизначення методу є прикладом динамічного прив'язки. |
Типи класів і полів використовуються для статичного прив'язки. | Об'єкти використовуються для динамічного прив'язки. |
Приватні, кінцеві та статичні сутності використовують статичне прив'язування. | Віртуальні методи використовують динамічне прив'язку. |
Віртуальна функція / метод на Java
Віртуальна функція або метод у Java - це функція, яка використовується з поліморфізмом виконання. На відміну від С ++, Java не має спеціального 'віртуального' ключового слова для позначення того, що метод є віртуальним. Метод, який визначений у базовому класі та замінений у похідному класі, є віртуальним.
У Java за замовчуванням кожен нестатичний метод, крім приватного та фінального, є віртуальною функцією. Отже, зауважте, що методи, які ми обговорили вище, переважні для реалізації поліморфізму часу виконання, також є віртуальними методами.
Оскільки статичний метод прив'язаний до Класу і не може бути викликаний за допомогою об'єкта, його не можна використовувати з поліморфізмом виконання, а також він не є віртуальною функцією.
Інтерфейси в Java за замовчуванням є віртуальними. Класи, що реалізують інтерфейси, забезпечують реалізацію методів інтерфейсу. Як і в поліморфізмі середовища виконання, методи виклику інтерфейсу також вирішуються під час виконання.
Пам'ятайте, що оскільки методи в інтерфейсі призначені для заміни, усі методи інтерфейсу є віртуальними функціями.
Наприклад, розглянемо такий код:
interface car{ void accelerate(); } class Maruti implements car{ void accelerate () { System.out.println(“Maruti car accelerated!!”); } }
У наведеному вище коді метод accelerate () є віртуальною функцією, оскільки він є частиною інтерфейсу автомобіля і призначений для заміни.
Анотація @override в Java
Анотація @override - це анотація за замовчуванням у Java. Ця анотація була представлена в Java 1.5. Анотація @override використовується, коли метод підкласу замінює свій метод суперкласу.
Використовуючи анотацію Java @override, щоб вказати, що метод перевизначає метод батьківського класу, компілятор видає попередження, якщо анотований метод не замінено. Тож робить обов'язковим перевизначення методу, коли використовується анотація @override.
По-друге, за допомогою анотації @override ми робимо код більш читабельним. Ми можемо одразу зрозуміти, що метод, який декларується, повинен бути замінений.
Загальним синтаксисом анотації Java @override є
public @interface override
У наведеній нижче програмі Java показано використання анотації @override.
//base class definition class BaseClass { public void display() { System.out.println('BaseClass::display () method'); } } //derived class inheriting base class class DerivedClass extends BaseClass { @Override //indicates the display method being overridden public void display() { System.out.println('DerivedClass::display () method'); } } // main class public class Main { public static void main(String args()) { System.out.println('@Override Example'); //BaseClass type object;contain child object BaseClass testObj = new DerivedClass(); //call display method based on contents of object i.e. derived class display () testObj.display(); } }
Вихід:
У наведеній вище програмі ми маємо BaseClass, який визначає метод відображення. Потім ми виводимо клас DerivedClass з цього BaseClass і позначаємо метод відображення анотацією @override. Цей метод замінено в DerivedClass.
В основному методі ми створюємо посилання на об'єкт BaseClass і спрямовуємо його на об'єкт DerivedClass, що змушує посилання викликати метод відображення DerivedClass.
Якби ми не реалізували метод display () у класі Derived, тоді компілятор дав би попередження компілятору, оскільки воно позначене анотацією @override.
Перевантаження та заміна в Java
Тепер, коли ми обговорили як перевантаження, так і перевизначення в Java, давайте підсумуємо ці два поняття.
Перевантаження пов'язане з поліморфізмом часу компіляції, тобто ми реалізуємо поліморфізм часу компіляції, використовуючи перевантаження. Перевантаження здійснюється двома способами, тобто перевантаження методів та перевантаження оператора.
в моделі osi який шар знаходиться внизу і представляє обладнання, яке формує мережу?
Перевантаження методів - це техніка, при якій ми маємо більше одного методу з однаковим іменем, але різними списками параметрів. Список параметрів диференціюється на основі кількості параметрів, типів параметрів або послідовності параметрів.
Перевантаження оператора в Java обмежене, і це дозволяє нам перевантажувати лише оператор ‘+’, який використовується для додавання двох чисел та об’єднання двох об’єктів String.
Перевантаження вирішується під час компіляції і є статичним. Його також називають «Рання прив’язка» .
Заміна методу - це функція, за допомогою якої ми реалізуємо поліморфізм часу виконання. При перевизначенні методу метод батьківського класу замінюється в дочірньому класі. Це означає, що прототип методу як у супер, так і в підкласі залишається однаковим, але реалізації різні.
Перевизначення методу використовує техніку динамічного відправлення методу, щоб вирішити виклик методу та вирішити, чи викликати метод суперкласу чи підкласу, і це робиться під час виконання.
Отже, поліморфізм часу виконання також називають динамічним поліморфізмом або пізнім зв'язуванням.
Далі давайте розкладемо таблиці на відмінності між перевантаженням та перевизначенням у Java.
Перевантаження проти перевизначення в Java
Перевантаження | Перевизначення |
---|---|
Перевантаження використовується в поліморфізмі під час компіляції. | Заміщення реалізовано в поліморфізмі виконання. |
Можна робити в одному класі. Може або не вимагати спадкування. | Перевизначення завжди вимагає успадкування. |
Методи перевантажені однаковою назвою методу та іншим списком параметрів. | Перевизначені методи мають однакові прототипи. |
Тип повернення не враховується при перевантаженні методу. | Тип повернення повинен бути однаковим у методах перевизначення та перевизначення. |
Покращує читабельність програми. | Заміщення дозволяє мати конкретний клас реалізації з розумом. |
Часті запитання
Q # 1) Чи можемо ми замінити статичний метод?
Відповідь: Ні. Статичні методи не можна замінити в Java. Це пояснюється тим, що статичні методи базуються на класах і викликаються класом безпосередньо. Їм не потрібні об’єкти, які можна викликати під час виконання. Отже, відправлення статичного методу визначається компілятором.
Q # 2) Чи можемо ми замінити конструктор?
Відповідь: Ні, ми не можемо замінити конструктор. Конструктор викликається при створенні об'єкта. Це не називається об'єктом. Крім того, однією з вимог перевизначення є перевизначений метод, і метод заміщення повинен мати однаковий підпис методу, що неможливо у випадку конструкторів.
Q # 3) Чому перевизначення методу називається динамічним поліморфізмом?
Відповідь: У разі перевизначення методу виклик методу вирішується динамічно під час виконання. Звідси це називається динамічним поліморфізмом.
Q # 4) Яка користь від динамічного поліморфізму в Java?
Відповідь: Динамічний поліморфізм використовує метод динамічного відправлення методу, який підтримує заміщення методу, так що підклас може забезпечити конкретну реалізацію заміненого методу. Таким чином ми можемо реалізувати специфічні функції, які дозволяють нам писати ефективні програми.
По-друге, нам також не потрібно турбуватися про вирішення викликів методів, оскільки динамічне відправлення методів вирішує, який метод викликати.
Q # 5) Яка різниця між статичним та динамічним прив'язуванням?
Відповідь: Зв'язок між викликом методу та його реалізацією називається зв'язуванням. Коли це зв’язування вирішується під час компіляції, ми називаємо це статичним прив’язуванням. Коли прив'язка виконується динамічно під час виконання, тоді ми називаємо це динамічним прив'язуванням.
Статичне прив’язування використовує тип даних класу та полів для розв’язання викликів методів. Динамічне прив’язування використовує об’єкти для розв’язання викликів методів. Статичне зв'язування також називається поліморфізмом під час компіляції, а динамічне зв'язування також називається поліморфізмом виконання.
Висновок
У цьому підручнику ми детально обговорили поліморфізм виконання в Java.
Поліморфізм виконання виконується з використанням перевизначення методу. Заміна методу виконується в підкласі, де метод, визначений у суперкласі, перевизначений або замінений у своєму підкласі. Підпис методу залишається незмінним у супер та підкласі.
Використовуючи перевизначення методу, ми можемо забезпечити конкретну реалізацію того самого методу в підкласі. Таким чином, ми можемо писати більш ефективні програми, що передбачають успадкування. Java забезпечує анотацію @override, щоб вказати, що метод має бути замінений.
За замовчуванням усі нестатичні методи, які не є остаточними, є віртуальними в Java. Усі віртуальні методи можна замінити.
=> Тут слідкуйте за простими навчальними серіями Java.
Рекомендована література
- Заміна попередньо визначених методів у Java
- Довжина рядка Java () Метод із прикладами
- Що таке поліморфізм у Java - Підручник із прикладами
- Як використовувати метод Java toString?
- Індекс рядка Java методу з прикладами коду
- Рядок Java містить () Підручник із методів із прикладами
- Метод розділення рядка Java () - Як розділити рядок у Java
- Рядок Java порівняти до методу з прикладами програмування