Polymorfismus v Java (Statické a dynamické)
⚡ Chytré shrnutí
Polymorfismus v Java umožňuje jednomu rozhraní reprezentovat mnoho forem, takže jeden název metody se chová odlišně napříč souvisejícími třídami. Je to pilíř objektově orientovaného designu, který podporuje flexibilitu, opětovné použití kódu a čisté rozšíření starších bankovních, lékařských a podnikových systémů.

V čem je polymorfismus Java?
Polymorfismus v Java nastává, když je jedna nebo více tříd nebo objektů vzájemně propojeno dědičností. Je to schopnost objektu nabývat mnoha forem. 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 komunikace, i když přístup se může lišit.
Například chytrý telefon se používá ke komunikaci. Komunikačním režimem může být hovor, textová zpráva, obrazová zpráva nebo e-mail. Cíl je společný, tedy komunikace, ale přístup je odlišný. Toto chování je podstatou PolymorfismusNyní se naučíme polymorfismus v Java s ukázkovým kódem, diagramy a podrobným vysvětlením.
klikněte zde pokud video není přístupné
Proč používat polymorfismus v Java?
Polymorfismus v Java se používá, protože umožňuje flexibilní, opakovaně použitelný a snadnější údržbu kódu. Jedna referenční proměnná nadřazeného typu může ukazovat na několik podřízených objektů, takže stejné volání se přizpůsobí jakékoli dodané podtřídě. Tento vzor udržuje testovaný kód nedotčený, zatímco se prostřednictvím specializovaných podtříd přidává nové chování, a to je přesně důvod, proč na něm závisí frameworky jako Spring a Jakarta EE.
Java Polymorfismus v OOP s příkladem
Uvažujme jednu rodičovskou třídu s názvem Účet s funkcemi pro vklad a výběr. Třída Account má dvě podtřídy. Operace vkladu a výběru jsou stejné pro spořicí a běžné účty, takže zděděné metody z třídy Account budou fungovat.
Java Příklad polymorfismu
Změna v požadavcích na software
Došlo ke změně ve specifikaci požadavků, což je v softwarovém průmyslu běžné. Je nutné přidat funkcionalitu pro privilegovaný bankovní účet s možností přečerpání. Přečerpání je možnost, kdy si zákazník může vybrat částku vyšší, než je disponibilní zůstatek na účtu. Metoda výběru pro privilegovaný účet vyžaduje novou implementaci, zatímco testovaný kód v oblasti spořicích a běžných účtů zůstává nedotčen. Tato izolace je výhodou… OOPS.
Krok 1) Když je volána metoda výběru pro spořicí účet, provede se metoda definovaná v nadřazené třídě Account.
Krok 2) Když je volána metoda výběru pro privilegovaný účet (kontokorent), provede se metoda výběru definovaná v privilegované třídě. Toto odeslání je Polymorfismus v objektově orientovaných programovacích metodách (OOP).
Přepis metody v Java
Přepsání metody je proces předefinování metody nadtřídy uvnitř podtřídy. Podtřída si zachovává stejnou konzistenci.tract, ale poskytuje novou implementaci, která je vybrána při spuštění programu.
Pravidla pro přepisování metod
- Signatura metody, tedy název metody, seznam parametrů a návratový typ, se musí přesně shodovat.
- Přepsaná metoda může rozšířit přístupnost, ale nemůže ji zúžit. Pokud je metoda v základní třídě privátní, 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 metod a přepsáním metod
K přetížení metod dochází uvnitř stejné třídy se stejným názvem metody, ale s různými signaturami. K přepsání metod dochází napříč vztahem mezi třídami rodič-potomek, kde podtřída předefinuje metodu deklarovanou v nadtřídě.
| Přetížení metod je ve stejné třídě, kde více metod má stejný název, ale různé signatury. | K přepsání metody dochází, 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 objektově orientovaných programovacích prostředích (OOP) je mechanismus, kterým lze definovat více metod se stejným názvem a signaturou v nadtřídě a podtřídě. Volání přepsané metody je řešeno za běhu pomocí dynamické vazby uvnitř JVM.
Příklad dynamického polymorfismu
Referenční proměnná nadtřídy se může odkazovat na objekt podtřídy:
Doctor obj = new Surgeon();
Zvažte toto tvrzení:
obj.treatPatient();
Zde je referenční proměnná Obj patří do nadřazené třídy, ale objekt, na který ukazuje, patří do podřízené třídy, jak je znázorněno na diagramu polymorfismu.
Volání obj.treatPatient() spustí metodu treatPatient() podtřídy Surgeon. Pokud je k volání metody použit odkaz na základní třídu, JVM určí, která metoda bude vyvolána, na základě skutečného objektu, na který odkaz odkazuje. I když Obj je odkaz na Doctor, volá metodu Surgeon, protože ukazuje na objekt Surgeon. Rozhodnutí se provádí za běhu, a proto se nazývá Dynamický polymorfismus nebo běhový 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 to přetížení metod. | Týká se to přepsání metody. |
| Chyby, pokud existují, se řeší při kompilaci. Protože se kód během kompilace neprovádí, je název statický.
ex: void sum (int a , int b); void sum (float a, double b); int sum (int a, int b); //compiler gives error. |
Když referenční proměnná volá přepsanou metodu, metoda, která má být vyvolána, je určena objektem, na který referenční proměnná odkazuje. To lze určit pouze za běhu kódu, a proto je 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 spustit funkcionalitu definovanou ve třídě Doctor a poté provést své vlastní specifické chování? 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ě nadtřídy uvnitř podtřídy. 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: Naučit se dědičnost, polymorfismus a klíčové slovo super
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(){ // overridden 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) Odkomentujte řádky 6 až 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 = ? Je to proto, že podtřída nemůže přistupovat k soukromým členům nadtřídy.





