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ů.

  • 🎭 Mnoho forem, jedno jméno: Polymorfismus v Java umožňuje odesílání metody se stejným názvem do různých implementací na základě skutečného typu objektu v době provádění.
  • 🔀 Dvě příchutě: Polymorfismus za kompilace používá přetížení metod, zatímco polymorfismus za běhu používá přepsání metod prostřednictvím dědičnosti a JVM.
  • ⛓️ Statická vs. dynamická vazba: Přetížená volání se řeší v době kompilace pomocí statické vazby, zatímco přepsaná volání se řeší za běhu pomocí dynamické vazby.
  • (Tj. Super síla klíčových slov: Klíčové slovo super umožňuje podtřídě vyvolat nadřazenou implementaci před přidáním vlastního specializovaného chování.
  • 🧪 Dosah v reálném světě: Bankovní účty, hierarchie nemocničního personálu a enginy pro vykreslování tvarů se spoléhají na polymorfismus, aby mohly vytvářet nové požadavky bez narušení testovaného kódu.

Polymorfismus v Java

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.

Jediné dědictví v Java

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.

Java Polymorfismus

Krok 1) Když je volána metoda výběru pro spořicí účet, provede se metoda definovaná v nadřazené třídě Account.

Java Polymorfismus

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).

Java Polymorfismus

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.

Pravidla pro přepis metody v Java

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í metody
Přepsání metody
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.

Statický polymorfismus
Dynamický polymorfismus
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.

Nejčastější dotazy

Polymorfismus v Java je schopnost objektu nabývat mnoha forem. Stejný název metody může spouštět různý kód v závislosti na tom, na který objekt podtřídy se odkazuje za běhu, což je základní chování OOP.

Java podporuje polymorfismus za kompilace prostřednictvím přetížení metod a polymorfismus za běhu pomocí přepsání metod. Přetížení se řeší za kompilace pomocí statické vazby, zatímco přepsání se řeší za běhu pomocí dynamické vazby, kterou zpracovává JVM.

Statická vazba propojuje volání metody s její definicí v době kompilace a používá se pro přetížení metod. Dynamická vazba propojuje volání za běhu na základě skutečného typu objektu a umožňuje přepsání metody v... Java.

Klíčové slovo super umožňuje podtřídě volat přepsanou metodu nebo přistupovat k datovému členu z nadřazené třídy. To umožňuje podtřídě znovu použít nadřazenou logiku a poté na ni vrstvit specializované chování.

Lektoři umělé inteligence, jako například ChatGPT a GitHub Copilot Chat, mohou vysvětlit polymorfismus v Java s vlastními analogiemi, generujte cvičné úlohy, procházejte dědičnými stromy a pro rychlejší zvládnutí si žáky kladte otázky týkající se statické versus dynamické vazby.

Ano. Asistenti pro refaktoring s využitím umělé inteligence, jako jsou Cursor, Sourcegraph Cody a IntelliJ AI Assistant, dokáží odhalit duplicitní podmíněné výrazy, navrhnout hierarchie tříd a přepsat starší verze. Java kód tak, aby přepsání metody nahradilo opakované řetězce if-else.

Shrňte tento příspěvek takto: