Polymorfismus v Java (Statické a dynamické)
V čem je polymorfismus Java?
Polymorfismus in Java nastane, když existuje jedna nebo více tříd nebo objektů, které spolu souvisí dědičností. Je to schopnost předmětu mít mnoho podob. Dědičnost umožňuje uživatelům dědit atributy a metody a polymorfismus používá tyto metody k provádění různých úkolů. Cílem je tedy komunikace, ale přístup je jiný.
Například máte smartphone pro komunikaci. Komunikační režim, který zvolíte, může být jakýkoli. Může to být hovor, textová zpráva, obrázková zpráva, mail atd. Společný cíl je tedy komunikace, ale jejich přístup je odlišný. Tomu se říká Polymorfismus. Nyní se naučíme polymorfismus v Java s příkladem.
klikněte zde pokud video není přístupné
Java Polymorfismus v OOP s příkladem
Máme jednu nadřazenou třídu, „Účet“ s funkcí vkladu a výběru. Účet má 2 dětské třídy. Operace vkladu a výběru je stejná pro spořicí i běžné účty. Takže zděděné metody z třídy Account budou fungovat.
Změna v požadavcích na software
Dochází ke změně specifikace požadavků, což je v softwarovém průmyslu tak běžné. Předpokládá se, že přidáte funkcionalitu zvýhodněného bankovního účtu s kontokorentním úvěrem. Na pozadí je kontokorent nástroj, kde můžete vybrat částku vyšší, než je dostupný zůstatek na vašem účtu. Metodu stažení pro privilegované potřeby tedy implementujte znovu. Testovaný kód ale v Spořicím a běžném účtu neměníte. Toto je výhoda OOPS
Krok 1) Taková, že když je zavolána metoda „stažena“ pro uložení účtu, provede se metoda z nadřazené třídy účtů
Krok 2) Ale když je metoda „Výběr“ pro privilegovaný účet (možnost přečerpání) nazývána metodou výběru definovanou v privilegované třídě, je provedena. Tohle je Polymorfismus v OOP.
Přepis metody v Java
Přepsání metody předefinuje metodu supertřídy v podtřídě.
Pravidla pro přepisování metod
- Signatura metody, tj. název metody, seznam parametrů a návratový typ, se musí přesně shodovat.
- Přepsaná metoda může rozšířit přístupnost, ale ne ji zúžit, tj. pokud je soukromá v základní třídě, podřízená třída ji může zveřejnit, ale ne naopak.
Příklad
class Doctor{ public void treatPatient(){ // treatPatient method } class Surgeon extends Doctor{ public void treatPatient(){ // treatPatient method } } Class run{ public static void main (String args[]){ Doctor doctorObj = new Doctor() // treatPatient method in class Doctor will be executed doctorObj.treatPatient(); Surgeon surgeonObj = new Surgeon(); // treatPatient method in class Surgeon will be executed surgeonObj.treatPatient(); } }
Rozdíl mezi přetížením a přepsáním
Přetížení metody je ve stejné třídě, kde více než jedna metoda má stejný název, ale různé signatury. | Přepsání metody je, když je jedna z metod v nadtřídě předefinována v podtřídě. V tomto případě zůstává signatura metody stejná. |
ex:
void sum (int a , int b); void sum (int a , int b, int c); void sum (float a, double b); |
ex:
class X{ public int sum(){ // some code } } class Y extends X{ public int sum(){ //overridden method //signature is same } } |
Co je dynamický polymorfismus?
Dynamický polymorfismus v OOP je mechanismus, kterým lze definovat více metod se stejným názvem a podpisem v nadtřídě a podtřídě. Volání přepsané metody se vyřeší za běhu.
Příklad dynamického polymorfismu:
Referenční proměnná nadtřídy může odkazovat na objekt podtřídy
Doctor obj = new Surgeon();
Zvažte prohlášení
obj.treatPatient();
Zde je referenční proměnná „obj“ nadřazené třídy, ale objekt, na který ukazuje, je podřízené třídy (jak je znázorněno na níže uvedeném příkladu polymorfismu).
obj.treatPatient() provede metodu treatPatient() podtřídy – Chirurg
Pokud je k volání metody použit odkaz na základní třídu, o metodě, která má být vyvolána, rozhoduje JVM v závislosti na objektu, na který odkaz ukazuje.
Například, i když je obj odkazem na Doctor, volá metodu Surgeon, protože ukazuje na objekt Surgeon
O tom se rozhoduje během běhu a proto se to nazývá dynamický or run-time polymorfismus
Rozdíl mezi statickým a dynamickým polymorfismem
Statický polymorfismus v Java je typ polymorfismu, který shromažďuje informace pro volání metody v době kompilace, zatímco dynamický polymorfismus je typ polymorfismu, který shromažďuje informace pro volání metody za běhu.
Týká se přetížení metody. | Týká se přepisování metody. |
Případné chyby jsou vyřešeny v době kompilace. Protože kód není během kompilace spuštěn, proto název static.
ex: void sum (int a , int b); void sum (float a, double b); int sum (int a, int b); //compiler gives error. |
V případě, že referenční proměnná volá přepsanou metodu, je metoda, která má být vyvolána, určena objektem, na který odkazuje vaše referenční proměnná. To lze určit pouze za běhu, když je kód spuštěn, proto název dynamický.
ex: //reference of parent pointing to child object Doctor obj = new Surgeon(); // method of child called obj.treatPatient(); |
Super klíčové slovo v Java
Co když metoda treatPatient ve třídě Surgeon chce provést funkcionalitu definovanou ve třídě Doctor a poté provést svou vlastní specifickou funkci? V tomto případě klíčové slovo super
lze použít pro přístup k metodám nadřazené třídy z podřízené třídy. Metoda treatPatient ve třídě Surgeon by mohla být napsána jako:
treatPatient(){ super.treatPatient(); //add code specific to Surgeon }
Klíčové slovo super lze použít pro přístup k libovolnému datovému členu nebo metodám nadtřídy v podtřídě.
Dále se seznámíme s klíčovým slovem Super, Dědictví a Polymorfismus v Java s ukázkovými programy.
Příklad:-Chcete-li se naučit dědičnost, polymorfismus a super klíčové slovo
Krok 1) Zkopírujte následující kód do editoru
public class Test{ public static void main(String args[]){ X x= new X(); Y y = new Y(); y.m2(); //x.m1(); //y.m1(); //x = y;// parent pointing to object of child //x.m1() ; //y.a=10; } } class X{ private int a; int b; public void m1(){ System.out.println("This is method m1 of class X"); } } class Y extends X{ int c; // new instance variable of class Y public void m1(){ // overriden method System.out.println("This is method m1 of class Y"); } public void m2(){ super.m1(); System.out.println("This is method m2 of class Y"); } }
Krok 2) Uložte, zkompilujte a spusťte kód. Sledujte výstup.
Krok 3) Odkomentuje řádky č. 6-9. Uložte, zkompilujte a spusťte kód. Sledujte výstup.
Krok 4) Odkomentujte řádek č. 10. Uložte a zkompilujte kód.
Krok 5) Chyba = ? Důvodem je, že podtřída nemá přístup k soukromým členům nadtřídy.
Shrnutí
- Polymorfismus v objektově orientovaném programování nastává, když existuje jedna nebo více tříd nebo objektů, které spolu souvisí dědičností. Je to schopnost předmětu mít mnoho podob.
- Přepsání metody předefinuje metodu supertřídy v podtřídě.
- Dynamický polymorfismus v Java je mechanismus, kterým lze definovat více metod se stejným názvem a podpisem v nadtřídě a podtřídě.
- Statický polymorfismus v Java je typ polymorfismu, který shromažďuje informace pro volání metody v době kompilace, zatímco dynamický polymorfismus je typ polymorfismu, který shromažďuje informace pro volání metody za běhu.
- Klíčové slovo super lze použít pro přístup k metodám nadřazené třídy z podřízené třídy.