Polimorfizmus be Java (Statikus és dinamikus)

⚡ Okos összefoglaló

Polimorfizmus be Java lehetővé teszi, hogy egyetlen felület számos űrlapot reprezentáljon, így egyetlen metódusnév másképp viselkedik a kapcsolódó osztályok között. Az objektumorientált tervezés egyik pillére, amely elősegíti a rugalmasságot, a kód újrafelhasználását és a hagyományos banki, orvosi és vállalati rendszerek tiszta kiterjesztését.

  • 🎭 Sokféle forma, egy név: Polimorfizmus be Java lehetővé teszi, hogy ugyanaz a metódusnév a végrehajtás idején a tényleges objektumtípus alapján különböző implementációkhoz kerüljön.
  • 🔀 Két íz: A fordítási idejű polimorfizmus metódus-túlterhelést használ, míg a futási idejű polimorfizmus metódus-felülbírálást használ öröklődésen és a JVM-en keresztül.
  • ⛓️ Statikus vs. dinamikus kötés: A túlterhelt hívások fordítási időben statikus kötésen keresztül oldódnak fel, míg a felülbírált hívások futási időben dinamikus kötésen keresztül oldódnak fel.
  • ✅ Szuper kulcsszóerő: A super kulcsszó lehetővé teszi egy alosztály számára, hogy meghívja a szülő implementációt, mielőtt hozzáadná a saját specializált viselkedését.
  • 🧪 Valós elérhetőség: A bankszámlák, a kórházi személyzet hierarchiái és az alakzatrenderelő motorok mind a polimorfizmusra támaszkodnak az új követelmények növelése érdekében anélkül, hogy a tesztelt kódot fel kellene bontani.

Polimorfizmus be Java

Miben rejlik a polimorfizmus? Java?

Polimorfizmus be Java A polimorfizmus akkor fordul elő, amikor egy vagy több osztály vagy objektum öröklődés útján kapcsolódik egymáshoz. Ez egy objektum azon képessége, hogy sokféle formát öltsön. Az öröklődés lehetővé teszi a felhasználók számára, hogy attribútumokat és metódusokat örököljenek, és a polimorfizmus ezeket a metódusokat különböző feladatok végrehajtására használja. A cél a kommunikáció, bár a megközelítés eltérő lehet.

Például egy okostelefont kommunikációra használnak. A kommunikációs mód lehet hívás, szöveges üzenet, képüzenet vagy e-mail. A cél közös, azaz a kommunikáció, de a megközelítés eltérő. Ez a viselkedés a lényege... polimorfizmusMost a polimorfizmust fogjuk tanulni Java példakóddal, ábrákkal és lépésről lépésre bemutatott magyarázatokkal.

Kattints itt ha a videó nem érhető el

Miért használjuk a polimorfizmust? Java?

Polimorfizmus be Java azért használják, mert rugalmassá, újrafelhasználhatóvá és könnyebben karbantarthatóvá teszi a kódot. Egyetlen szülő típusú referenciaváltozó több gyermekobjektumra is mutathat, így ugyanaz a hívás alkalmazkodik a megadott alosztályhoz. Ez a minta érintetlenül hagyja a tesztelt kódot, miközben új viselkedést ad hozzá speciális alosztályokon keresztül, pontosan ezért támaszkodnak rá olyan keretrendszerek, mint a Spring és a Jakarta EE.

Java Polimorfizmus az OOP-ban példával

Tekintsünk egy szülő osztályt, melynek neve Fiók befizetés és kivétel függvényekkel. Az Account osztálynak két gyermekosztálya van. A befizetés és a kivétel működése megegyezik a megtakarítási és folyószámlák esetében, így az Account osztálytól örökölt metódusok fognak működni.

Egyetlen öröklődés be Java

Java Példa a polimorfizmusra

Változás a szoftverkövetelményben

Változás történt a követelményspecifikációban, ami gyakori a szoftveriparban. Hozzá kell adni a kiemelt bankszámla, folyószámlahitel funkcióját. A folyószámlahitel egy olyan lehetőség, ahol az ügyfél a számlán rendelkezésre álló egyenlegnél nagyobb összeget vehet fel. A kiemelt számla kifizetési módszeréhez újra kell implementálni, míg a megtakarítási és folyószámláknál tesztelt kódot érintetlenül kell hagyni. Ez az elszigeteltség a következő előny: Hoppá.

Java polimorfizmus

Step 1) Amikor a Takarékszámlához tartozó "withdraw" metódus meghívásra kerül, a szülő Account osztályban definiált metódus hajtódik végre.

Java polimorfizmus

Step 2) Amikor a privilegizált számlához (overdraft facility) tartozó withdraw metódus meghívásra kerül, a privilegizált osztályban definiált withdraw metódus végrehajtásra kerül. Ez a diszpécser a következő: Polimorfizmus az OOP-okban.

Java polimorfizmus

Módszer felülbírálása be Java

A metódus felülírása egy alosztályon belüli szuperosztály metódus újradefiniálásának folyamata. Az alosztály megtartja ugyanazt a metódust.tract, de egy friss implementációt biztosít, amely a program futtatásakor kerül kiválasztásra.

A módszer felülbírálásának szabályai

  • A metódus szignatúrájának, azaz a metódus nevének, a paraméterlistának és a visszatérési típusnak pontosan meg kell egyeznie.
  • A felülírt metódus szélesítheti az elérhetőséget, de nem szűkítheti azt. Ha a metódus privát az alaposztályban, akkor a gyermekosztály nyilvánossá teheti, de fordítva nem.

A módszer felülbírálásának szabályai Java

Példa

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();
  }
}

Különbség a módszer túlterhelése és a módszer felülbírálása között

A metódus túlterhelés ugyanazon osztályon belül történik, ugyanazzal a metódusnévvel, de eltérő szignatúrával. A metódus felülbírálása szülő-gyermek osztálykapcsolaton keresztül történik, ahol az alosztály újradefiniál egy, a szuperosztályban deklarált metódust.

Módszer Túlterhelés
Módszer felülbírálása
A Method Overloading ugyanabba az osztályba tartozik, ahol egynél több metódusnak ugyanaz a neve, de eltérő szignatúrája van. Metódusfelülírásról akkor beszélünk, amikor a szuperosztály egyik metódusát újradefiniáljuk az alosztályban. Ebben az esetben a metódus szignatúrája (signature) változatlan marad.
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
 }
}

Mi az a dinamikus polimorfizmus?

Az OOP-okban a dinamikus polimorfizmus az a mechanizmus, amellyel több metódus definiálható ugyanazzal a névvel és szignatúrával a szuperosztályban és az alosztályban is. A felülírt metódusok hívása futásidőben, a JVM-en belüli dinamikus kötésen keresztül oldódik fel.

Dinamikus polimorfizmus példa

A szuperosztály referenciaváltozója hivatkozhat egy alosztály objektumra:

 Doctor obj = new Surgeon();

Tekintsük a következő állítást:

obj.treatPatient();

Itt a referencia változó obj a szülő osztályba tartozik, de az objektum, amire mutat, a gyermek osztályba tartozik, ahogy az a polimorfizmus diagramján is látható.

A hívás obj.treatPatient() végrehajtja a Surgeon alosztály treatPatient() metódusát. Amikor egy alaposztály-hivatkozást használunk egy metódus meghívására, a meghívott metódust a JVM dönti el a hivatkozás által mutatott tényleges objektum alapján. Annak ellenére, hogy obj Ha a Doctor objektumra hivatkozik, akkor a Surgeon metódusát hívja meg, mivel az egy Surgeon objektumra mutat. A döntés futásidőben születik meg, ezért nevezik Dinamikus polimorfizmus vagy futásidejű polimorfizmus.

A statikus és a dinamikus polimorfizmus közötti különbség

Statikus polimorfizmus be Java egy olyan polimorfizmus, amely a fordítási időben gyűjti össze a metódus meghívásához szükséges információkat, míg a dinamikus polimorfizmus egy olyan polimorfizmus, amely futási időben gyűjti össze a metódus meghívásához szükséges információkat.

Statikus polimorfizmus
Dinamikus polimorfizmus
A módszer túlterheléshez kapcsolódik. A metódus felülbírálásához kapcsolódik.
Az esetleges hibákat fordítási időben javítjuk. Mivel a kód nem fut fordítás közben, a név statikus.

ex:

void sum (int a , int b);
void sum (float a, double b);
int sum (int a, int b); //compiler gives error.
Amikor egy referenciaváltozó egy felülírt metódust hív meg, a meghívandó metódust az az objektum határozza meg, amelyre a referenciaváltozó mutat. Ez csak futásidőben, a kód végrehajtása alatt határozható meg, ezért a név dinamikus.

ex:

//reference of parent pointing to child object
 Doctor obj = new Surgeon();
// method of child called
obj.treatPatient();

Szuper kulcsszó be Java

Mi van akkor, ha a Surgeon osztály treatPatient metódusa végre akarja hajtani a Doctor osztályban definiált funkciókat, majd a saját specifikus viselkedését szeretné végrehajtani? Ebben az esetben a kulcsszó super használható a szülő osztály metódusainak eléréséhez a gyermekosztályból. A Sebész osztály kezelési páciens módszere a következőképpen írható fel:

treatPatient(){
   super.treatPatient();
     //add code specific to Surgeon
}

A „super” kulcsszóval a szuperosztály bármely adattagját vagy metódusát elérhetjük az alosztályon belül. Ezután megismerkedünk a „super” kulcsszóval, Öröklés, és a polimorfizmus a Java példaprogramokkal.

Példa: Az öröklődés, a polimorfizmus és a szuper kulcsszó megtanulása

Step 1) Másolja be a következő kódot egy szerkesztőbe.

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");
      }
}

Step 2) Mentsd el, fordítsd le és futtasd a kódot. Figyeld meg a kimenetet.

Step 3) Töröld ki a kommenteket a 6–9. sorokból. Mentsd el, fordítsd le és futtasd a kódot. Figyeld meg a kimenetet.

Step 4) Töröld ki a 10. sort a megjegyzésből. Mentsd el és fordítsd le a kódot.

Step 5) Hiba = ? Ez azért van, mert az alosztály nem férhet hozzá a szuperosztály privát tagjaihoz.

GYIK

Polimorfizmus be Java egy objektum azon képessége, hogy sokféle formát öltsön. Ugyanaz a metódusnév különböző kódot futtathat attól függően, hogy melyik alosztály objektumra hivatkoznak futásidőben, ami az OOP alapvető viselkedése.

Java támogatja a fordítási idejű polimorfizmust a metódus túlterhelésen és a futási idejű polimorfizmust a metódus felülbíráláson keresztül. A túlterhelés fordítási időben statikus kötésen keresztül, míg a felülbírálás futási időben, a JVM által kezelt dinamikus kötésen keresztül oldódik fel.

A statikus kötés fordítási időben összekapcsolja a metódushívást a definíciójával, és a metódus túlterhelésére szolgál. A dinamikus kötés futási időben összekapcsolja a hívást az aktuális objektumtípus alapján, és a metódus felülbírálását biztosítja. Java.

A super kulcsszó lehetővé teszi egy alosztály számára, hogy meghívja a felülírt metódust, vagy hozzáférjen a szülő osztályának egy adattagjához. Ez lehetővé teszi az alosztály számára, hogy újra felhasználja a szülő logikáját, majd rárétegezze a specializált viselkedést.

Az olyan MI-oktatók, mint a ChatGPT és a GitHub Copilot Chat, el tudják magyarázni a polimorfizmust Java Egyéni analógiákkal gyakorlófeladatokat generálhatsz, öröklődési fákat követhetsz végig, és a tanulókat statikus és dinamikus kötésekről kérdezheted a gyorsabb elsajátítás érdekében.

Igen. A mesterséges intelligencián alapuló refaktorálási asszisztensek, mint például a Cursor, a Sourcegraph Cody és az IntelliJ AI Assistant, képesek felismerni a duplikált feltételes utasításokat, osztályhierarchiákat javasolni és átírni a korábbi verziókat. Java kódot úgy, hogy a metódusfelülírás lecserélje az ismétlődő if-else láncokat.

Foglald össze ezt a bejegyzést a következőképpen: