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.

Jediné dědictví v Java
Java Příklad polymorfismu

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

Java Polymorfismus

Krok 1) Taková, že když je zavolána metoda „stažena“ pro uložení účtu, provede se metoda z nadřazené třídy účtů

Java Polymorfismus

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.

Java Polymorfismus

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.

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 a přepsáním

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

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