java override method overriding
Този урок обяснява как да постигнете полиморфизъм по време на работа в Java с помощта на метода Overriding и @override анотация с прости примери:
Вече обсъдихме подробно концепцията за полиморфизма и полиморфизма по време на компилация. В този урок ще продължим с полиморфизма по време на изпълнение в Java.
За разлика от полиморфизма по време на компилация, при който извикването на метод се разрешава по време на компилация, при полиморфизма по време на изпълнение, извикването на метода се разрешава по време на изпълнение.
=> Проверете ВСИЧКИ уроци за Java тук.
Какво ще научите:
- Полиморфизъм по време на изпълнение в Java
- @override Анотация в Java
- Претоварване и замяна в Java
- Заключение
Полиморфизъм по време на изпълнение в Java
Полиморфизъм по време на изпълнение, който е известен още като динамичен полиморфизъм или Динамично изпращане на метод е техника, при която извикването на отменен метод се разрешава динамично по време на изпълнение.
Полиморфизмът по време на изпълнение в Java се постига с помощта на „ заместване на метода ”. Замяна на метод е техника, чрез която методът в родителския клас се предефинира или замества в дъщерния клас.
Когато методът е заменен в клас, техниката за изпращане на динамичен метод разрешава извикването на заместения метод по време на изпълнение, а не по време на компилация.
Постигане на полиморфизъм по време на изпълнение в Java - Метод за замяна
Замяна на метода е подходът, който използваме за постигане на полиморфизъм по време на изпълнение в Java. Както вече споменахме, заместването на метода е техника, при която подкласът добавя метод, който вече присъства в неговия родителски клас, и добавя нова функционалност към този метод. Тогава казваме, че методът на базовия клас е заменен.
Новият метод, който дефинирахме в подкласа със същия прототип като метода на родителския клас, но различно изпълнение се нарича „ заместващ метод ” . Методът в родителския клас е известен като „ Заменен метод ”.
безплатно студио youtube към mp3 конвертор -
След като методът бъде заменен, остава въпросът как е разрешено извикването на този заменен метод?
Обикновено извикваме заменения метод чрез референцията на базовия клас. Ще създадем препратка към тип база и след това ще присвоим обект на дъщерен клас, използвайки новата ключова дума.
По този начин зависи от съдържанието на референтната променлива или кой обект е рефериран от референцията на базовия клас, който определя кой метод да бъде извикан. Така че, ако референтните обекти сочат към обекта на дъщерния клас, тогава се извиква методът за отмяна.
В противен случай, ако референтният обект съдържа обект на основен клас, тогава се извиква заменения метод. Една тема, която трябва да бъдем ясни в полиморфизма по време на изпълнение, особено за изпращането на динамични методи, е „Upcasting“, което е обяснено по-долу.
Upcasting
Когато референтен обект на родителския клас, който обсъдихме по-горе, сочи към или се отнася до обекта на подкласа, тогава го наричаме Upcasting.
Нека разберем актуализирането, като използваме прост пример.
Помислете, че имаме клас „BaseClass“ и ние разширяваме този BaseClass, за да създадем нов клас DerivedClass. Тази структура изглежда както е показано по-долу.
class BaseClass { ….//BaseClass code here } class DerivedClass extends BaseClass{ ….//DerivedClass code here }
Сега, за да приложим upcasting, ще декларираме референтна променлива от тип 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. След това в основния метод създаваме референтен обект на родителския клас с име ‘родител’.
Първо, ние му присвояваме обект от родителския клас и след това извикваме метода „Print ()“. След това повтаряме това, като присвояваме първо обекта child1 и след това обекта child2 на родителската препратка.
най-добрият безплатен mp3 изтеглящ музика
Резултатът показва, в зависимост от съдържанието на родителската препратка, и се извиква подходящият метод за печат.
Предимства на динамичния / по време на изпълнение полиморфизъм
- При динамичен полиморфизъм на програмиста е позволено да замени методите.
- Той позволява на класовете да дефинират метод с общо изпълнение, който неговите производни могат след това да отменят и да предоставят конкретното изпълнение.
- При динамично изпращане на метод извикването на метода се разрешава по време на изпълнение, за разлика от претоварването, което се решава по време на компилиране. Това позволява повече гъвкавост на програмистите.
Тъй като полиморфизмът по време на изпълнение свързва подходящия метод с повикването по време на изпълнение и ние също го наричаме динамично обвързване или късно свързване . Компилационният полиморфизъм от друга страна поддържа статично обвързване или ранно обвързване .
Статично срещу динамично свързване
Статично свързване | Динамично обвързване |
---|---|
Извикването на метод, разрешено по време на компилация, е статично обвързване. | Извикването на метод, разрешено по време на изпълнение, е динамично обвързване. |
Претоварването на метода е пример за статично свързване. | Заменянето на метода е пример за динамично обвързване. |
Типовете класове и полета се използват за статично свързване. | Обектите се използват за динамично свързване. |
Частни, крайни и статични обекти използват статично свързване. | Виртуалните методи използват динамично обвързване. |
Виртуална функция / метод в Java
Виртуалната функция или метод в Java е функция, която се използва с полиморфизъм по време на изпълнение. За разлика от C ++, Java няма специална „виртуална“ ключова дума за да се обозначи, че методът е виртуален. Метод, който е дефиниран в базовия клас и заменен в производния клас, е виртуален.
В Java по подразбиране всеки нестатичен метод с изключение на private и final е виртуална функция. Така че имайте предвид, че методите, които обсъдихме по-горе, заменящи изпълнението на полиморфизма по време на изпълнение, също са виртуални методи.
Тъй като статичният метод е свързан с Class и не може да бъде извикан с помощта на обект, той не може да се използва с полиморфизъм по време на изпълнение и освен това не е виртуална функция.
Интерфейсите в 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 () в извлечения клас, тогава компилаторът би дал предупреждение на компилатора, тъй като е маркиран с анотация @override.
Претоварване и замяна в Java
Сега, когато обсъдихме както претоварването, така и заместването в Java, нека обобщим тези две концепции.
Претоварването е свързано с полиморфизма по време на компилация, т.е.прилагаме полиморфизъм по време на компилация, използвайки претоварване. Претоварването се извършва по два начина, т.е. претоварване на метода и претоварване на оператора.
Претоварването на метода е техниката, при която имаме повече от един метод с едно и също име, но различни списъци с параметри. Списъкът с параметри се диференцира въз основа на броя на параметрите, видовете параметри или последователността на параметрите.
Претоварването на оператора в Java е ограничено и ни позволява да претоварваме само оператора ‘+’, който се използва за добавяне на две числа и обединяване на два String обекта.
Претоварването се разрешава по време на компилация и е статично. Нарича се още ‘Ранно обвързване’ .
Замяна на метода е функция, с която ние прилагаме полиморфизъм по време на изпълнение. При заместване на метод, методът на родителския клас е заменен в дъщерния клас. Това означава, че прототипът на метода както в супер, така и в подклас остава същият, но реализациите са различни.
Заместването на метода използва техниката за изпращане на динамичен метод, за да разреши извикването на метода и да реши дали да извика метод на суперклас или подклас и това се прави по време на изпълнение.
Следователно полиморфизмът по време на работа се нарича още динамичен полиморфизъм или късно свързване.
След това нека разделим разделите между претоварването и заместването в Java.
Претоварване срещу замяна в Java
Претоварване | Замяна |
---|---|
Претоварването се използва в полиморфизма по време на компилация. | Заменянето се реализира в полиморфизма по време на изпълнение. |
Може да се направи в същия клас. Може или не може да изисква наследяване. | Заменянето винаги изисква наследяване. |
Методите са претоварени със същото име на метод и различен списък с параметри. | Заменените методи имат едни и същи прототипи. |
Типът на връщане не се взема предвид при претоварване на метода. | Типът на връщане трябва да бъде еднакъв при заменени и отменящи методи. |
Подобрява четливостта на програмата. | Заменянето позволява да се има специфичен клас на изпълнение. |
често задавани въпроси
В # 1) Можем ли да заменим статичния метод?
Отговор: Не. Статичните методи не могат да бъдат заменени в Java. Това е така, защото статичните методи са базирани на класа и се извикват директно от класа. Те не се нуждаят от обекти, които да извикват по време на изпълнение. Следователно изпращането на статичен метод се определя от компилатора.
В # 2) Можем ли да заменим конструктора?
Отговор: Не, не можем да заменим конструктор. При създаването на обекта се извиква конструктор. Не се нарича обект. Също така, едно от изискванията за заместване е методът за заместване и методът за заместване трябва да има същия подпис на метода, което не е възможно в случай на конструктори.
В # 3) Защо заместването на метода се нарича динамичен полиморфизъм?
Отговор: В случай на замяна на метода, извикването на метода се разрешава динамично по време на изпълнение. Следователно това се нарича динамичен полиморфизъм.
използвайки eclipse за c ++
В # 4) Каква е ползата от динамичния полиморфизъм в Java?
Отговор: Динамичният полиморфизъм използва техника за изпращане на динамичен метод, която поддържа заместване на метода, така че подкласът да може да осигури специфично изпълнение на заменения метод. По този начин можем да внедрим специфичните функции, които ни позволяват да пишем ефективни програми.
На второ място, ние също не трябва да се притесняваме за разрешаването на извикванията на методите, тъй като динамичното изпращане на метод решава кой метод да извика.
В # 5) Каква е разликата между статичното и динамичното обвързване?
Отговор: Връзката между извикване на метод и неговото изпълнение се нарича обвързване. Когато това свързване е разрешено по време на компилация, ние го наричаме като статично обвързване. Когато обвързването се извършва динамично по време на изпълнение, тогава ние го наричаме като динамично обвързване.
Статичното обвързване използва типа данни на клас и полета за разрешаване на извиквания на методи. Динамичното обвързване използва обекти за разрешаване на извиквания на методи. Статичното свързване се нарича още полиморфизъм по време на компилация, а динамичното свързване също се нарича полиморфизъм по време на изпълнение.
Заключение
В този урок обсъдихме подробно полиморфизма по време на изпълнение в Java.
Полиморфизмът по време на изпълнение е реализиран с използване на метода, заместващ. Замяна на метода се извършва в подкласа, където методът, дефиниран в суперкласа, се предефинира или замества в неговия подклас. Подписът на метода остава същият в супер и подкласа.
Използвайки заместване на метода, можем да осигурим конкретна реализация на същия метод в подкласа. По този начин можем да напишем по-ефективни програми, които включват наследяване. Java предоставя анотация @override, за да покаже, че методът трябва да бъде заменен.
По подразбиране всички нестатични методи, които не са окончателни, са виртуални в Java. Всички виртуални методи могат да бъдат заменени.
=> Внимавайте тук за простите учебни серии за Java.
Препоръчително четене
- Замяна на предварително дефинирани методи в Java
- Дължина на низа на Java () Метод с примери
- Какво е полиморфизъм в Java - Урок с примери
- Как да използвам Java toString метод?
- Java String indexOf метод с примери за кодове
- Java String съдържа () Урок за метод с примери
- Метод за разделяне на низове в Java () - Как да разделя низ в Java
- Java String compareTo метод с примери за програмиране