java override method overriding
Овај водич објашњава како постићи рунтиме полиморфизам у Јави помоћу методе Оверридинг Метход и анотације @оверриде са једноставним примерима:
Већ смо детаљно разговарали о концепту полиморфизма и полиморфизму компајлираног времена. У овом упутству ћемо наставити са полиморфизмом извођења у Јави.
За разлику од полиморфизма времена компајлирања у којем се позив методе разрешава у време компајлирања, у рунтиме полиморфизму, позив методе решава се током извођења.
=> Овде проверите СВЕ Јава туторијале.
Шта ћете научити:
Рунтиме полиморфизам у Јави
Полиморфизам током извођења који је такође познат као динамички полиморфизам или Отпрема динамичке методе је техника у којој се надјачани позив методе динамички решава за време извођења.
Рунтиме полиморфизам у Јави постиже се коришћењем „ превладавање методе ”. Замена методе је техника којом се метода у родитељској класи поново дефинише или поништава у подређеној класи.
Када је метода замењена у класи, техника слања динамичке методе решава надјачани позив методе у време извршавања, а не у време компајлирања.
Постићи рунтиме полиморфизам у Јави - надјачавање метода
Надјачавање метода је приступ који користимо за постизање рунтиме полиморфизма у Јави. Као што је већ поменуто, замена метода је техника у којој подкласа додаје методу која је већ присутна у њеној родитељској класи и додаје нову функционалност овој методи. Тада кажемо да је метода основне класе замењена.
Нова метода коју смо дефинисали у подкласи са истим прототипом као и метода родитељске класе, али различита имплементација назива се „ метода замене ” . Метода у родитељској класи позната је као „ Замењена метода ”.
ц ++ слееп_фор
Једном када је метода надјачана, остаје питање како је позив ове надјачане методе решен?
Надређену методу обично називамо референцом основне класе. Направићемо референцу типа басе, а затим додијелити објект подређене класе помоћу нове кључне ријечи.
Дакле, то зависи од садржаја референтне променљиве или на који се објекат референцира референцом основне класе који одређује који ће се метод позвати. Дакле, ако референтни објекти упућују на објекат подређене класе, тада се позива метода замене.
У супротном, ако референтни објекат садржи објект основне класе, тада се позива надјачана метода. Једна тема која треба да нам буде јасна у рунтиме полиморфизму, посебно за динамичко слање метода, је „Упцастинг“ која је објашњена у наставку.
Упцастинг
Када референтни објекат надређене класе о којем смо горе говорили упућује на објект подкласе или се односи на њега, тада га називамо Упцастинг.
Хајде да разумемо ажурирање на једноставном примеру.
Узмите у обзир да имамо класу „БасеЦласс“ и проширујемо овај БасеЦласс да бисмо креирали нову класу ДериведЦласс. Ова структура изгледа као што је приказано у наставку.
class BaseClass { ….//BaseClass code here } class DerivedClass extends BaseClass{ ….//DerivedClass code here }
Сада да имплементирамо надоградњу прогласићемо референтну променљиву типа БасеЦласс. Даље, додељујемо објекат ДериведЦласс референци класе БасеЦласс као што је урађено у доњем наредбеном коду.
BaseClass base = new DerivedClass (); //Upcasting
Дакле, овде можемо рећи да смо надоградили објекат ДериведЦласс на БасеЦласс. Што се тиче полиморфизма током извођења, концепт надоградње је веома важан.
Стога је генерално ажурирање поступак додељивања објеката детета или поткласе референци родитеља или суперкласе.
SuperClass reference = new Subclass Object;
Јава програм у наставку приказује надјачавање метода и такође показује како се врши надоградња за решавање замењених позива метода током извршавања.
//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
Излаз:
У горњем програму имамо две класе, тј. Дете1 и дете2, које су изведене из класе „Родитељ“. Родитељска класа има метод „Штампај“ који је поништен и у одељењима детета1 и детета2. Затим у главној методи креирамо референтни објекат класе Родитељ под називом „родитељ“.
Прво му доделимо објекат класе Родитељ, а затим позивамо методу „Принт ()“. Затим ово понављамо додељивањем прво објекта цхилд1, а затим објектом цхилд2 родитељској референци.
шта у Ц ++ значи недефинисана референца
Излаз приказује, у зависности од садржаја родитељске референце, и позива се одговарајући метод штампања.
Предности динамичког / рунтим полиморфизма
- Са динамичким полиморфизмом, програмеру је дозвољено да замени методе.
- Омогућава класама да дефинишу методу са општом реализацијом коју њени деривати могу затим заменити и пружају конкретну имплементацију.
- Са динамичким слањем методе, позив методе се решава за време извођења, за разлику од преоптерећења о којем се одлучује у време компајлирања. Ово омогућава већу флексибилност програмерима.
Како полиморфизам времена извршавања везује одговарајућу методу за позив у време извођења, а ми је такође називамо динамичко везивање или касно везивање . С друге стране, полиморфизам компајлираног времена статичко везивање или рано везивање .
Статичко вс динамичко везивање
Статично везивање | Динамичко везивање |
---|---|
Позив методе решен у време компајлирања је статично везивање. | Позив методе разрешен током извршавања је динамичко везивање. |
Преоптерећење метода је пример статичког везивања. | Замена методе је пример динамичког везивања. |
Типови класа и поља се користе за статичко везивање. | Објекти се користе за динамичко везивање. |
Приватни, коначни и статички ентитети користе статичко везивање. | Виртуелне методе користе динамичко везивање. |
Виртуелна функција / метод у Јави
Виртуелна функција или метод у Јави је функција која се користи са Рунтиме полиморфизмом. За разлику од Ц ++, Јава нема посебну „виртуелну“ кључну реч да означи да је метода виртуелна. Метода која је дефинисана у основној класи и поништена у изведеној класи је виртуелна.
У Јави је свака нестетичка метода, осим приватне и финалне, подразумевано виртуелна функција. Дакле, имајте на уму да су методе о којима смо горе расправљали надјачавајуће за примену полиморфизма времена извођења такође виртуалне методе.
Како је статички метод везан за класу и не може се позвати помоћу објекта, не може се користити са рунтиме полиморфизмом и такође није виртуелна функција.
Интерфејси у Јави су подразумевано виртуелни. Класе које имплементирају интерфејсе пружају имплементације метода интерфејса. Као и у рунтиме полиморфизму, позиви на интерфејс методе се такође решавају током извођења.
Имајте на уму да су методе у интерфејсу дизајниране да буду надјачане, све методе интерфејса су виртуелне функције.
На пример, узмите у обзир следећи код:
interface car{ void accelerate(); } class Maruti implements car{ void accelerate () { System.out.println(“Maruti car accelerated!!”); } }
У горњем коду, метода аццелерате () је виртуелна функција јер је део интерфејса и дизајниран је да буде надјачан.
Напомена @оверриде у Јави
Напомена @оверриде је подразумевана напомена у Јави. Ова напомена је представљена у Јави 1.5. Ознака @оверриде се користи када метода подкласе надјача своју методу суперкласе.
Коришћењем Јава @оверриде анотације да укаже да метода превладава надређену методу класе, компајлер издаје упозорење ако анотирани метод није надјачан. Стога је обавезно да се метода замени када се користи напомена @оверриде.
Друго, помоћу напомене @оверриде чинимо код читљивијим. Одједном можемо схватити да метод који се декларише треба надјачати.
Општа синтакса Јава @оверриде напомене је
public @interface 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(); } }
Излаз:
У горњем програму имамо БасеЦласс који дефинише метод приказа. Затим из ове класе изводимо класу ДериведЦласс и означавамо метод приказа ознаком @оверриде. Ова метода је замењена у изведеном разреду.
У главној методи креирамо референцу објекта БасеЦласс и усмеравамо је на објект ДериведЦласс због чега референца позива метод приказа ДериведЦласс.
Да нисмо имплементирали методу дисплаи () у изведеној класи, тада би преводилац дао упозорење компајлеру, јер је означена ознаком @оверриде.
Преоптерећење и замена у Јави
Сад кад смо разговарали и о преоптерећењу и надјачавању у Јави, хајде да резимирамо ова два концепта.
Преоптерећење је повезано са полиморфизмом времена компајлирања, тј. Ми имплементирамо полиморфизам времена компајлирања користећи преоптерећење. Преоптерећење се врши на два начина, тј. Преоптерећење метода и преоптерећење оператора.
Преоптерећење метода је техника у којој имамо више метода са истим именом, али различитим листама параметара. Листа параметара разликује се на основу броја параметара, врста параметара или низа параметара.
Преоптерећење оператора у Јави је ограничено и омогућава нам да преоптеретимо само оператор ‘+’ који се користи за додавање два броја и спајање два Стринг објекта.
Преоптерећење је решено у време компајлирања и статично је. Такође се назива „Рано обавезивање“ .
Надјачавање метода је функција помоћу које имплементирамо полиморфизам времена извођења. У замени метода, метода родитељске класе је замењена у подређеној класи. То значи да прототип методе и у супер и у подкласи остаје исти, али су примене различите.
Замена методе користи технику слања динамичке методе да би разрешила позив методе и одлучила да ли да позове метод суперкласе или подкласе, а то се ради током извршавања.
случајни број ц ++ између 0 и 100
Отуда се полиморфизам током извођења назива и динамичким полиморфизмом или касним везивањем.
Следеће, табуларизирајмо разлике између преоптерећења и замене у Јави.
Преоптерећење против замене у Јави
Преоптерећење | Превазилажење |
---|---|
Преоптерећење се користи у полиморфизму током компајлирања. | Замена се примењује у полиморфизму током извођења. |
Може се радити у истој класи. Може или не мора захтевати наследство. | Превазилажење увек захтева наслеђивање. |
Методе су преоптерећене истим именом методе и другом листом параметара. | Замењене методе имају исте прототипове. |
Тип повратка се не узима у обзир код преоптерећења методе. | Тип повратка треба да буде исти у надјачаним и надјачавајућим методама. |
Побољшава читљивост програма. | Замена омогућава мудро одређену класу примене. |
Често постављана питања
П # 1) Можемо ли заменити статички метод?
Одговор: Не. Статичке методе се не могу заменити у Јави. То је зато што се статичке методе заснивају на класи и класа их директно позива. Не требају им објекти које би могли да призивају током извођења. Отуда компајлер одређује отпрему статичке методе.
П # 2) Можемо ли заменити конструктор?
Одговор: Не, не можемо надјачати конструктор. Конструктор се позива када се објекат креира. Не назива се објектом. Такође, један од захтева надјачавања је надјачана метода и метода надјачавања треба да има исти потпис методе, што није могуће у случају конструктора.
П # 3) Зашто се надјачавање метода назива динамичким полиморфизмом?
Одговор: У случају замене методе, позив методе се решава динамички током извођења. Отуда се назива динамичким полиморфизмом.
П # 4) Каква је корист од динамичког полиморфизма у Јави?
Одговор: Динамички полиморфизам користи технику слања динамичке методе која подржава надјачавање метода тако да поткласа може пружити специфичну примену надјачане методе. На овај начин можемо применити специфичне карактеристике које нам омогућавају писање ефикасних програма.
Друго, такође не треба да бринемо о решавању позива методе јер динамичко слање метода одлучује који метод да позовемо.
П # 5) Која је разлика између статичког и динамичког везивања?
Одговор: Веза између позива методе и њене имплементације назива се везивањем. Када се ово повезивање реши у време компајлирања, називамо га статичким везивањем. Када се везивање врши динамички током извођења, тада то називамо динамичким везивањем.
Статичко везивање користи тип података класе и поља за решавање позива метода. Динамичко везивање користи објекте за решавање позива метода. Статичко везивање се такође назива полиморфизам у времену компајлирања, а динамичко везивање се такође назива полиморфизам времена извођења.
Закључак
У овом упутству детаљно смо разговарали о полиморфизму током извођења у Јави.
Рунтиме полиморфизам је имплементиран применом методе која замењује. Замена методе врши се у подкласи, при чему се метода дефинисана у суперкласи редефинише или поништава у својој подкласи. Потпис методе остаје исти у супер и подкласи.
Коришћењем замене метода можемо обезбедити специфичну примену исте методе у подкласи. На овај начин можемо писати ефикасније програме који укључују наслеђивање. Јава пружа анотацију @оверриде да би наговестила да метод треба поништити.
Подразумевано су све нестетичке методе које нису коначне виртуелне у Јави. Све виртуалне методе могу се надјачати.
=> Овде припазите на једноставну серију Јава тренинга.
Препоручено читање
- Замена унапред дефинисаних метода у Јави
- Метода дужине Јава низа () Метода са примерима
- Шта је полиморфизам у Јави - лекција са примерима
- Како се користи Јава тоСтринг метод?
- Јава Стринг индекОф метода са примерима кода
- Јава Стринг садржи () Водич за методе са примерима
- Метода раздвајања Јава низа () - Како подијелити низ у Јави
- Јава Стринг цомпареТо метод са примерима програмирања