Polümorfism sisse Java (staatiline ja dünaamiline)

⚡ Nutikas kokkuvõte

Polümorfism sisse Java võimaldab ühel liidesel esindada paljusid vorme, seega käitub üks meetodi nimi seotud klassides erinevalt. See on objektorienteeritud disaini alustala, mis edendab paindlikkust, koodi taaskasutamist ja pärandpangandus-, meditsiini- ja ettevõttesüsteemide selget laiendamist.

  • 🎭 Paljud vormid, üks nimi: Polümorfism sisse Java laseb samal meetodil nime edastada erinevatele implementatsioonidele, lähtudes tegelikust objektitüübist täitmisajal.
  • 🔀 Kaks maitset: Kompileerimisaegne polümorfism kasutab meetodi ülekoormamist, samas kui käitusaegne polümorfism kasutab meetodi ülekirjutamist pärimise ja JVM-i kaudu.
  • ⛓️ Staatiline vs dünaamiline sidumine: Ülekoormatud kõned lahendatakse kompileerimise ajal staatilise sidumise kaudu, samas kui ülekoormatud kõned lahendatakse käitusajal dünaamilise sidumise kaudu.
  • Super märksõnade jõud: Märksõna „super“ laseb alamklassil enne oma spetsialiseeritud käitumise lisamist esile kutsuda vanema implementatsiooni.
  • 🧪 Reaalse maailma ulatus: Pangakontod, haiglapersonali hierarhiad ja kuju renderdusmootorid tuginevad polümorfismile, et kasvatada uusi nõudeid ilma testitud koodi rikkumata.

Polümorfism sisse Java

Mis on polümorfism Java?

Polümorfism sisse Java Polümorfism tekib siis, kui üks või mitu klassi või objekti on omavahel pärimise teel seotud. See on objekti võime võtta palju vorme. Pärimine võimaldab kasutajatel pärida atribuute ja meetodeid ning polümorfism kasutab neid meetodeid erinevate ülesannete täitmiseks. Eesmärk on suhtlemine, samas kui lähenemisviis võib erineda.

Näiteks nutitelefoni kasutatakse suhtlemiseks. Suhtlusviisiks võib olla kõne, tekstisõnum, piltsõnum või e-kiri. Eesmärk on ühine, st suhtlemine, kuid lähenemine on erinev. See käitumine ongi olemus. PolümorfismNüüd õpime polümorfismi Java näidiskoodi, diagrammide ja samm-sammult selgitustega.

Click siin kui video pole juurdepääsetav

Miks kasutada polümorfismi Java?

Polümorfism sisse Java kasutatakse, kuna see muudab koodi paindlikuks, taaskasutatavaks ja hõlpsamini hooldatavaks. Üks vanemtüübi viitemuutuja võib viidata mitmele alamobjektile, seega kohandub sama kutse antud alamklassiga. See muster hoiab testitud koodi puutumata, samal ajal kui uut käitumist lisatakse spetsiaalsete alamklasside kaudu, mistõttu raamistikud nagu Spring ja Jakarta EE sellest sõltuvad.

Java Polümorfism OOP-des koos näitega

Vaatleme ühte vanemaklassi nimega konto koos sissemakse ja väljamakse funktsioonidega. Klassil „Konto“ (Account) on kaks alamklassi. Sissemakse ja väljamakse toiming on säästu- ja arvelduskontode puhul sama, seega toimivad klassilt „Konto“ päritud meetodid.

Üksik pärand sisse Java

Java Polümorfismi näide

Tarkvaranõuete muudatus

Nõuete spetsifikatsioonis on toimunud muudatus, mis on tarkvaratööstuses tavaline. Lisada tuleb privilegeeritud pangakonto funktsionaalsus arvelduskrediidi võimalusega. Arvelduskrediit on võimalus, mille puhul klient saab välja võtta summa, mis on suurem kui kontol olev saldo. Privilegeeritud konto väljavõtmise meetod vajab uut rakendamist, samas kui hoiu- ja arvelduskontode testitud kood jäetakse puutumata. See eraldatus on eeliseks. OOPS.

Java Polümorfism

Step 1) Kui säästukonto väljamaksemeetodit kutsutakse, käivitatakse ülemklassis „Account” määratletud meetod.

Java Polümorfism

Step 2) Kui privilegeeritud konto (arvelduskrediidi) jaoks kutsutakse välja väljamaksemeetod, siis käivitatakse privilegeeritud klassis määratletud väljamaksemeetod. See väljamakse toimub järgmiselt: Polümorfism OOP-des.

Java Polümorfism

Meetod alistamine sisse Java

Meetodi tühistamine on protsess, mille käigus alamklassi sees olev ülemklassi meetod uuesti defineeritakse. Alamklass säilitab samad meetodid.tract, aga annab uue implementatsiooni, mis valitakse programmi käivitamisel.

Meetodi alistamise reeglid

  • Meetodi signatuur, st meetodi nimi, parameetrite loend ja tagastustüüp, peavad täpselt kokku sobima.
  • Ülekirjutatud meetod saab ligipääsetavust laiendada, kuid mitte kitsendada. Kui meetod on baasklassis privaatne, saab alamklass selle avalikuks teha, kuid mitte vastupidi.

Meetodi alistamise reeglid Java

Näide

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

Meetodi ülekoormamise ja meetodi alistamise erinevus

Meetodi ülekoormamine toimub sama klassi sees sama meetodinime, aga erinevate signatuuridega. Meetodi tühistamine toimub ülem-lapsklassi suhte kaudu, kus alamklass defineerib ümber ülemklassis deklareeritud meetodi.

Meetod Ülekoormus
Meetodi ületamine
Meetodi ülelaadimine kuulub samasse klassi, kus rohkem kui ühel meetodil on sama nimi, aga erinevad signatuurid. Meetodi tühistamine toimub siis, kui üks ülemklassi meetoditest defineeritakse alamklassis uuesti. Sellisel juhul jääb meetodi signatuur samaks.
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
 }
}

Mis on dünaamiline polümorfism?

Dünaamiline polümorfism OOP-ides on mehhanism, mille abil saab ülemklassis ja alamklassis defineerida mitu meetodit sama nime ja signatuuriga. Ülekirjutatud meetodi kutsumine lahendatakse käitusajal JVM-i sees dünaamilise sidumise abil.

Dünaamilise polümorfismi näide

Ülemklassi viitemuutuja saab viidata alamklassi objektile:

 Doctor obj = new Surgeon();

Mõelge järgmisele väitele:

obj.treatPatient();

Siin on võrdlusmuutuja obj kuulub ülemklassi, aga objekt, millele see osutab, kuulub lapsklassi, nagu on näidatud polümorfismi diagrammil.

Kõne obj.treatPatient() käivitab alamklassi Surgeon meetodi treatPatient(). Kui meetodi kutsumiseks kasutatakse baasklassi viidet, otsustab JVM, millise meetodi kutsutakse, lähtudes tegelikust objektist, millele viide osutab. Kuigi obj viitab Doktorile, kutsub see Kirurgi meetodit, kuna see viitab Kirurgi objektile. Otsus tehakse käitusajal, mistõttu seda nimetatakse Dünaamiline polümorfism või käitusaja polümorfism.

Staatilise ja dünaamilise polümorfismi erinevus

Staatiline polümorfism sisse Java on polümorfismi tüüp, mis kogub teavet meetodi kutsumiseks kompileerimise ajal, samas kui dünaamiline polümorfism on polümorfismi tüüp, mis kogub teavet meetodi kutsumiseks käitusajal.

Staatiline polümorfism
Dünaamiline polümorfism
See on seotud meetodi ülekoormamisega. See on seotud meetodi tühistamisega.
Vead, kui neid esineb, lahendatakse kompileerimise ajal. Kuna koodi kompileerimise ajal ei käivitata, on nimi staatiline.

ex:

void sum (int a , int b);
void sum (float a, double b);
int sum (int a, int b); //compiler gives error.
Kui viitemuutuja kutsub väljakirjutatud meetodit, määrab kutsutav meetod objekti, millele viitemuutuja osutab. Seda saab määrata ainult käitusajal, kui kood on täitmisel, mistõttu on nimi dünaamiline.

ex:

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

Supermärksõna sisse Java

Mis siis, kui Surgeon-klassi meetod treatPatient soovib käivitada Doctor-klassis määratletud funktsionaalsust ja seejärel sooritada oma spetsiifilist käitumist? Sel juhul on märksõna super saab kasutada vanemklassi meetoditele juurdepääsuks alamklassist. Kirurgi klassi ravipatsiendi meetodi võiks kirjutada järgmiselt:

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

Märksõna super saab kasutada alamklassi sees oleva ülemklassi mis tahes andmeliikmele või meetodile juurdepääsuks. Järgmisena tutvume märksõnaga super, Pärisosaja polümorfism Java näidisprogrammidega.

Näide: Pärimise, polümorfismi ja supervõtmsõna õppimiseks

Step 1) Kopeerige järgmine kood redaktorisse.

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) Salvesta, kompileeri ja käivita kood. Jälgi väljundit.

Step 3) Eemalda kommentaarid ridadelt 6 kuni 9. Salvesta, kompileeri ja käivita kood. Jälgi väljundit.

Step 4) Eemalda kommentaar reast 10. Salvesta ja kompileeri kood.

Step 5) Viga = ? Selle põhjuseks on asjaolu, et alamklass ei pääse ligi ülemklassi privaatsetele liikmetele.

KKK

Polümorfism sisse Java on objekti võime võtta palju erinevaid vorme. Sama meetodi nimi võib käivitada erinevat koodi olenevalt sellest, millisele alamklassi objektile käitusajal viidatakse, mis on OOP-i põhikäitumine.

Java toetab kompileerimise ajal esinevat polümorfismi meetodite ülekoormamise kaudu ja käitusajal esinevat polümorfismi meetodite alistamise kaudu. Ülekoormamine lahendatakse kompileerimise ajal staatilise sidumise kaudu, samas kui alistamine lahendatakse käitusajal JVM-i hallatava dünaamilise sidumise kaudu.

Staatiline sidumine seob kompileerimise ajal meetodikutse selle definitsiooniga ja seda kasutatakse meetodi ülekoormamiseks. Dünaamiline sidumine seob kutse käitusajal tegeliku objektitüübi põhjal ja annab meetodi ülekirjutamisele jõu. Java.

Märksõna „super“ võimaldab alamklassil kutsuda ülekirjutatud meetodit või pääseda ligi oma vanemklassi andmeliikmele. See võimaldab lapsel vanemloogikat taaskasutada ja seejärel sellele spetsialiseeritud käitumist lisada.

Tehisintellekti juhendajad, näiteks ChatGPT ja GitHub Copilot Chat, oskavad polümorfismi selgitada Java kohandatud analoogiate abil saate genereerida harjutusülesandeid, läbida pärimispuid ja testida õppijaid staatilise ja dünaamilise sidumise erinevuste kohta kiirema omandamise saavutamiseks.

Jah. Tehisintellektil põhinevad refaktorimisassistendid nagu Cursor, Sourcegraph Cody ja IntelliJ AI Assistant suudavad tuvastada dubleeritud tingimuslauseid, pakkuda välja klassihierarhiaid ja kirjutada ümber pärandi. Java kood nii, et meetodi alistamine asendab korduvaid if-else ahelaid.

Võta see postitus kokku järgmiselt: