java override method overriding
Tento výukový program vysvetľuje, ako dosiahnuť runtime polymorfizmus v Jave pomocou prepísania metódy a anotácie @override na jednoduchých príkladoch:
Koncept polymorfizmu a polymorfizmus v čase kompilácie sme už podrobne rozobrali. V tomto výučbe sa budeme venovať runtime polymorfizmu v Jave.
Na rozdiel od polymorfizmu v čase kompilácie, v ktorom je volanie metódy vyriešené v čase kompilácie, v runtime polymorfizme je volanie metódy vyriešené za behu.
=> Skontrolujte VŠETKY návody Java tu.
Čo sa dozviete:
Runtime polymorfizmus v Jave
Runtime polymorfizmus, ktorý je tiež známy ako dynamický polymorfizmus alebo Expedícia dynamickej metódy je a technika, pri ktorej je prepísané volanie metódy riešené dynamicky za behu.
Runtime polymorfizmus v Jave sa dosahuje použitím „ prevažujúca metóda “. Prepísanie metódy je technika, ktorou sa v podradenej triede predefinuje alebo prepíše metóda v podradenej triede.
Keď je metóda v triede prepísaná, technika odoslania dynamickej metódy rieši volanie prepísanej metódy za behu a nie v čase kompilácie.
Dosiahnite runtime polymorfizmus v prostredí Java - prepísanie metódy
Prepísanie metódy je prístup, ktorý používame na dosiahnutie runtime polymorfizmu v Jave. Ako už bolo spomenuté, prepísanie metódy je technika, pri ktorej podtrieda pridáva metódu, ktorá je už prítomná v jej nadradenej triede, a dodáva tejto metóde nové funkcie. Potom hovoríme, že je prepísaná metóda základnej triedy.
Nová metóda, ktorú sme v podtriede definovali, s rovnakým prototypom ako metóda nadradenej triedy, ale odlišná implementácia, sa nazýva „ prvoradá metóda “ . Metóda v materskej triede je známa ako „ Prepísaná metóda “.
čím sa otvárajú súbory json
Po prepísaní metódy zostáva otázkou, ako je vyriešené volanie tejto prepísanej metódy?
Prepísanú metódu zvyčajne nazývame prostredníctvom odkazu na základnú triedu. Vytvoríme odkaz na typovú základňu a potom pomocou nového kľúčového slova priradíme objekt podradenej triedy.
Závisí teda od obsahu referenčnej premennej alebo od toho, na ktorý objekt odkazuje referencia základnej triedy, ktorá určuje, ktorá metóda sa má volať. Takže ak referenčné objekty smerujú na objekt podradenej triedy, potom sa volá metóda prepísania.
V opačnom prípade, ak referenčný objekt obsahuje objekt základnej triedy, potom sa volá prepísaná metóda. Jednou z tém, ktorá musí byť v runtime polymorfizme jasná, najmä pre dynamické odosielanie metód, je „Upcasting“, ktorá je vysvetlená nižšie.
Upcasting
Keď referenčný objekt nadradenej triedy, o ktorom sme hovorili vyššie, ukazuje alebo odkazuje na objekt podtriedy, potom ho nazývame Upcasting.
Poďme rozumieť upcastingu na jednoduchom príklade.
Zvážte, že máme triedu „BaseClass“ a túto BaseClass rozšírime, aby sme vytvorili novú triedu DerivedClass. Táto štruktúra vyzerá nasledovne.
class BaseClass { ….//BaseClass code here } class DerivedClass extends BaseClass{ ….//DerivedClass code here }
Teraz, aby sme implementovali upcasting, vyhlásime referenčnú premennú typu BaseClass. Ďalej priradíme objekt DerivedClass k odkazu na triedu BaseClass, ako je to urobené v nasledujúcom príkaze kódu.
BaseClass base = new DerivedClass (); //Upcasting
Takže tu môžeme povedať, že sme preniesli objekt DerivedClass na BaseClass. Pokiaľ ide o runtime polymorfizmus, je veľmi dôležitý pojem upcasting.
Vo všeobecnosti je teda upcasting proces priraďovania podradených objektov alebo podtried k odkazom na nadradenú alebo nadtriedu.
SuperClass reference = new Subclass Object;
Nižšie uvedený program Java demonštruje prepísanie metódy a tiež ukazuje, ako sa vykonáva upcasting s cieľom vyriešiť prepísané volania metód za behu programu.
//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
Výkon:
Vo vyššie uvedenom programe máme dve triedy, tj. Child1 a child2, ktoré sú odvodené z triedy „Parent“. Nadradená trieda má metódu „Tlačiť“, ktorá je prepísaná v triedach child1 aj child2. Potom v hlavnej metóde vytvoríme referenčný objekt nadradenej triedy s názvom ‘rodič’.
Najskôr mu priradíme objekt nadradenej triedy a potom zavoláme metódu „Print ()“. Potom to zopakujeme tak, že najskôr priradíme objekt child1 a potom objekt child2 k rodičovskému odkazu.
sql rozhovor otázky a odpovede pre testerov
Výstup zobrazuje v závislosti od obsahu nadradenej referencie a nazýva sa príslušná metóda tlače.
Výhody dynamického / runtime polymorfizmu
- Pri dynamickom polymorfizme môže programátor prepísať metódy.
- Umožňuje triedam definovať metódu so všeobecnou implementáciou, ktorú potom môžu jej deriváty prepísať a poskytnúť konkrétnu implementáciu.
- Pri dynamickom odosielaní metódy sa volanie metódy rieši za behu, na rozdiel od preťaženia, o ktorom sa rozhoduje v čase kompilácie. To umožňuje programátorom väčšiu flexibilitu.
Pretože runtime polymorfizmus viaže príslušnú metódu na hovor v čase behu a my ho tiež voláme dynamická väzba alebo neskorá väzba . Polymorfizmus v kompilácii na druhej strane podporuje statická väzba alebo skorá väzba .
Statická vs. dynamická väzba
Statické viazanie | Dynamická väzba |
---|---|
Volanie metódy vyriešené v čase kompilácie je statická väzba. | Volanie metódy vyriešené za behu je dynamická väzba. |
Príkladom statického viazania je preťaženie metódy. | Prepísanie metódy je príkladom dynamickej väzby. |
Na statické viazanie sa používajú typy tried a polí. | Objekty sa používajú na dynamické viazanie. |
Súkromné, konečné a statické entity používajú statickú väzbu. | Virtuálne metódy používajú dynamické viazanie. |
Virtuálna funkcia / metóda v prostredí Java
Virtuálna funkcia alebo metóda v Jave je funkcia, ktorá sa používa s runtime polymorfizmom. Na rozdiel od C ++ Java nemá špeciálne „virtuálne“ kľúčové slovo na označenie, že metóda je virtuálna. Metóda, ktorá je definovaná v základnej triede a prepísaná v odvodenej triede, je virtuálna.
V Jave je štandardne každá nestatická metóda okrem súkromnej a konečnej virtuálna funkcia. Takže si všimnite, že metódy, o ktorých sme vyššie hovorili, sú prvkami virtuálnych metód.
Pretože statická metóda je viazaná na triedu a nemožno ju zavolať pomocou objektu, nemožno ju použiť s runtime polymorfizmom a taktiež nejde o virtuálnu funkciu.
Rozhrania v Jave sú predvolene virtuálne. Triedy implementujúce rozhrania poskytujú implementácie pre metódy rozhrania. Rovnako ako v behovom polymorfizme, aj volanie za účelom vykonávania rozhraní je riešené za behu.
Pamätajte, že pretože metódy v rozhraní sú navrhnuté na prepísanie, všetky metódy rozhrania sú virtuálnymi funkciami.
Zvážte napríklad nasledujúci kód:
interface car{ void accelerate(); } class Maruti implements car{ void accelerate () { System.out.println(“Maruti car accelerated!!”); } }
Vo vyššie uvedenom kóde je metóda accelerate () virtuálna funkcia, pretože je súčasťou rozhrania vozidla a je navrhnutá na prepísanie.
@override Anotácia v jazyku Java
Anotácia @override je predvolená anotácia v jazyku Java. Táto anotácia bola zavedená v prostredí Java 1.5. Anotácia @override sa používa, keď metóda podtriedy prepíše metódu nadtriedy.
Použitím anotácie Java @override na označenie, že metóda je nadradená metóde nadradenej triedy, kompilátor vydá varovanie, ak anotovaná metóda nie je prepísaná. Preto je povinné prepísanie metódy, keď sa použije anotácia @override.
Po druhé, použitím anotácie @override urobíme kód čitateľnejším. Hneď si môžeme uvedomiť, že deklarovaná metóda má byť prepísaná.
Všeobecná syntax anotácie Java @override je
public @interface override
Nižšie uvedený program Java ukazuje použitie anotácie @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(); } }
Výkon:
Vo vyššie uvedenom programe máme BaseClass, ktorá definuje metódu zobrazenia. Potom z tejto BaseClass odvodíme triedu DerivedClass a metódu zobrazenia označíme anotáciou @override. Táto metóda je prepísaná v DerivedClass.
V hlavnej metóde vytvoríme referenciu na objekt BaseClass a ukážeme ju na objekt DerivedClass, ktorý spôsobí, že referencia zavolá metódu zobrazenia DerivedClass.
Keby sme v triede Derived neimplementovali metódu display (), potom by kompilátor vydal varovanie kompilátora, pretože je označený anotáciou @override.
Preťaženie a prepísanie v Jave
Teraz, keď sme diskutovali o preťažení a prepísaní v Jave, zhrňme si tieto dva pojmy.
Preťaženie súvisí s polymorfizmom v čase kompilácie, to znamená, že polymorfizmus v čase kompilácie implementujeme pomocou preťaženia. Preťaženie sa vykonáva dvoma spôsobmi, t. J. Preťažením metódy a preťažením operátora.
Metóda preťaženia je technika, pri ktorej máme viac ako jednu metódu s rovnakým názvom, ale s rôznymi zoznamami parametrov. Zoznam parametrov je diferencovaný na základe počtu parametrov, typov parametrov alebo postupnosti parametrov.
Preťaženie operátora v Jave je obmedzené a umožňuje nám preťažiť iba operátor „+“, ktorý sa používa na pridanie dvoch čísel a zreťazenie dvoch objektov String.
Preťaženie je vyriešené v čase kompilácie a je statické. Tiež sa nazýva „Včasná väzba“ .
Metóda prepísania je funkcia, pomocou ktorej implementujeme runtime polymorfizmus. Pri prepísaní metódy je v nadradenej triede prepísaná metóda nadradenej triedy. To znamená, že prototyp metódy v super aj podtriede zostáva rovnaký, ale implementácie sú odlišné.
Prepísanie metódy používa na vyriešenie volania metódy techniku odoslania dynamickej metódy a rozhodne, či sa má volať metóda nadtriedy alebo podtriedy, a to sa deje za behu programu.
Preto sa runtime polymorfizmus nazýva aj dynamický polymorfizmus alebo neskorá väzba.
Ďalej si predstavme rozdiely medzi preťažením a prepísaním v Jave.
Preťaženie Vs Prepísanie v Jave
Preťaženie | Naliehavé |
---|---|
Pri polymorfizme v čase kompilácie sa používa preťaženie. | Prepísanie je implementované v runtime polymorfizme. |
Môže byť vykonané v rovnakej triede. Môže, ale nemusí vyžadovať dedičstvo. | Prekonanie vyžaduje vždy dedičstvo. |
Metódy sú preťažené rovnakým názvom metódy a iným zoznamom parametrov. | Prepísané metódy majú rovnaké prototypy. |
Pri preťažení metódy sa návratový typ nezohľadňuje. | Návratový typ by mal byť pri prepísaných a prepísaných metódach rovnaký. |
Zlepšuje čitateľnosť programu. | Prepísanie umožňuje mať konkrétnu implementačnú triedu. |
často kladené otázky
Otázka 1) Môžeme prepísať statickú metódu?
Odpoveď: Nie. V Jave nie je možné prepísať statické metódy. Je to tak preto, lebo statické metódy sú založené na triedach a trieda ich volá priamo. Nepotrebujú objekty, ktoré by mohli vyvolať za behu. Preto je odoslanie statickej metódy určené kompilátorom.
Otázka č. 2) Môžeme prepísať konštruktor?
Odpoveď: Nie, nemôžeme prepísať konštruktéra. Pri vytváraní objektu sa volá konštruktor. Nenazýva sa to objektom. Jednou z požiadaviek prepísania je tiež prepísaná metóda a prepísaná metóda by mala mať rovnaký podpis metódy, čo v prípade konštruktérov nie je možné.
Otázka 3) Prečo sa prepísanie metódy nazýva dynamický polymorfizmus?
Odpoveď: V prípade prepísania metódy sa volanie metódy rieši dynamicky za behu programu. Preto sa nazýva dynamický polymorfizmus.
Otázka č. 4) Aké je použitie dynamického polymorfizmu v Jave?
Odpoveď: Dynamický polymorfizmus využíva techniku odosielania dynamických metód, ktorá podporuje prepísanie metód, aby podtrieda mohla poskytnúť konkrétnu implementáciu prepísanej metódy. Týmto spôsobom môžeme implementovať špecifické funkcie, ktoré nám umožňujú písať efektívne programy.
Po druhé si tiež nemusíme robiť starosti s riešením volaní metód, pretože o tom, ktorú metódu máme volať, rozhoduje dynamické odosielanie metód.
Otázka č. 5) Aký je rozdiel medzi statickou a dynamickou väzbou?
Odpoveď: Prepojenie medzi volaním metódy a jej implementáciou sa nazýva väzba. Keď je toto prepojenie vyriešené v čase kompilácie, nazývame ho ako statické viazanie. Keď sa väzba vykonáva dynamicky za behu, potom ju voláme ako dynamická väzba.
Statická väzba používa na vyriešenie volaní metód dátový typ triedy a polí. Dynamická väzba používa objekty na riešenie volaní metód. Statická väzba sa tiež nazýva polymorfizmus v čase kompilácie a dynamická väzba sa nazýva aj runtime polymorfizmus.
Záver
V tomto tutoriáli sme podrobne rozobrali runtime polymorfizmus v Jave.
java programy pohovor otázky a odpovede
Runtime polymorfizmus sa implementuje pomocou prepísania metódy. Prepísanie metódy sa vykonáva v podtriede, pričom metóda definovaná v nadtriede je vo svojej podtriede predefinovaná alebo prepísaná. Podpis metódy zostáva v super a podtriede rovnaký.
Použitím prepísania metódy môžeme poskytnúť konkrétnu implementáciu tej istej metódy v podtriede. Týmto spôsobom môžeme písať efektívnejšie programy, ktoré zahŕňajú dedenie. Java poskytuje anotáciu @override, ktorá označuje, že metóda má byť prepísaná.
V predvolenom nastavení sú všetky nestatické metódy, ktoré nie sú konečné, v jazyku Java virtuálne. Všetky virtuálne metódy môžu byť prepísané.
=> Dajte si pozor na jednoduchú sériu školení Java tu.
Odporúčané čítanie
- Prekonanie preddefinovaných metód v Jave
- Metóda Java String length () s príkladmi
- Čo je polymorfizmus v Jave - návod s príkladmi
- Ako používať metódu Java toString?
- Metóda Java String indexOf s príkladmi kódu
- Java String obsahuje () Výukový program metód s príkladmi
- Metóda Java String Split () - Ako rozdeliť reťazec v Jave
- Metóda Java String compareTo s príkladmi programovania