Polimorfizam u Java (Statički i dinamički)

⚡ Pametni sažetak

Polimorfizam u Java omogućuje jednom sučelju predstavljanje mnogih oblika, pa se jedno ime metode ponaša drugačije u različitim povezanim klasama. To je stup objektno orijentiranog dizajna koji potiče fleksibilnost, ponovnu upotrebu koda i čisto proširenje naslijeđenih bankarskih, medicinskih i poslovnih sustava.

  • 🎭 Mnogo oblika, jedno ime: Polimorfizam u Java omogućuje istom nazivu metode slanje u različite implementacije na temelju stvarnog tipa objekta u vrijeme izvršavanja.
  • 🔀 Dva okusa: Polimorfizam za vrijeme kompajliranja koristi preopterećenje metoda, dok polimorfizam za vrijeme izvođenja koristi nadjačavanje metoda putem nasljeđivanja i JVM-a.
  • ⛓️ Statičko vs. dinamičko vezanje: Preopterećeni pozivi se rješavaju u vrijeme kompajliranja putem statičkog povezivanja, dok se nadjačani pozivi rješavaju u vrijeme izvođenja putem dinamičkog povezivanja.
  • ✅ Super moć ključnih riječi: Ključna riječ super omogućuje podklasi da pozove roditeljsku implementaciju prije dodavanja vlastitog specijaliziranog ponašanja na vrh.
  • 🧪 Doseg u stvarnom svijetu: Bankovni računi, hijerarhije bolničkog osoblja i mehanizmi za renderiranje oblika oslanjaju se na polimorfizam kako bi razvili nove zahtjeve bez kršenja testiranog koda.

Polimorfizam u Java

U čemu je polimorfizam Java?

Polimorfizam u Java događa se kada su jedna ili više klasa ili objekata međusobno povezani nasljeđivanjem. To je sposobnost objekta da poprimi mnoge oblike. Nasljeđivanje omogućuje korisnicima nasljeđivanje atributa i metoda, a polimorfizam koristi te metode za obavljanje različitih zadataka. Cilj je komunikacija, dok se pristup može razlikovati.

Na primjer, pametni telefon se koristi za komunikaciju. Način komunikacije može biti poziv, tekstualna poruka, slikovna poruka ili e-pošta. Cilj je uobičajen, a to je komunikacija, ali pristup je drugačiji. Ovo ponašanje je bit polimorfizamSada ćemo učiti o polimorfizmu u Java s primjerima koda, dijagramima i detaljnim objašnjenjima.

Kliknite ovdje ako video nije dostupan

Zašto koristiti polimorfizam u Java?

Polimorfizam u Java se koristi jer čini kod fleksibilnim, višekratno upotrebljivim i lakšim za održavanje. Jedna referentna varijabla roditeljskog tipa može pokazivati ​​na nekoliko podređenih objekata, tako da se isti poziv prilagođava bilo kojoj podklasi koja je navedena. Ovaj obrazac drži testirani kod netaknutim dok se novo ponašanje dodaje putem specijaliziranih podklasa, što je upravo razlog zašto okviri poput Springa i Jakarta EE ovise o njemu.

Java Polimorfizam u OOP-ovima s primjerom

Razmotrimo jednu roditeljsku klasu pod nazivom Korisnički račun s funkcijama za uplatu i isplatu. Klasa Račun ima dvije podklase. Operacija uplate i isplate ista je za štedne i tekuće račune, tako da će naslijeđene metode iz klase Račun raditi.

Jedno nasljeđe u Java

Java Primjer polimorfizma

Promjena u softverskim zahtjevima

Došlo je do promjene u specifikaciji zahtjeva, što je uobičajeno u softverskoj industriji. Mora se dodati funkcionalnost za povlašteni bankovni račun s mogućnošću prekoračenja. Prekoračenje je mogućnost u kojoj klijent može podići iznos veći od raspoloživog stanja na računu. Metoda podizanja za povlašteni račun zahtijeva novu implementaciju, dok testirani kod u štednim i tekućim računima ostaje netaknut. Ta izolacija je prednost... OOPS.

Java polimorfizam

Korak 1) Kada se pozove metoda isplate za Štedni račun, izvršava se metoda definirana u roditeljskoj klasi Račun.

Java polimorfizam

Korak 2) Kada se pozove metoda isplate za privilegirani račun (mogućnost prekoračenja), izvršava se metoda isplate definirana u privilegiranoj klasi. Ovo slanje je Polimorfizam u OOP-ima.

Java polimorfizam

Nadjačavanje metode u Java

Nadjačavanje metode je proces redefiniranja metode nadklase unutar podklase. Podklasa zadržava istu kontract, ali pruža novu implementaciju koja se odabire kada se program pokrene.

Pravila za nadjačavanje metode

  • Potpis metode, odnosno naziv metode, popis parametara i tip povratne vrijednosti, moraju se točno podudarati.
  • Nadjačana metoda može proširiti dostupnost, ali je ne može suziti. Ako je metoda privatna u osnovnoj klasi, podređena klasa je može učiniti javnom, ali ne i obrnuto.

Pravila za nadjačavanje metode u Java

Primjer

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

Razlika između preopterećenja metoda i nadjačavanja metoda

Preopterećenje metoda događa se unutar iste klase s istim nazivom metode, ali različitim potpisima. Nadjačavanje metoda događa se u odnosu klase roditelj-dijete, gdje podklasa redefinira metodu deklariranu u nadklasi.

Preopterećenje metode
Nadjačavanje metode
Preopterećenje metoda je unutar iste klase, gdje više metoda ima isto ime, ali različite potpise. Nadjačavanje metode je kada se jedna od metoda u nadklasi redefinira u podklasi. U tom slučaju, potpis metode ostaje isti.
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
 }
}

Što je dinamički polimorfizam?

Dinamički polimorfizam u OOP-ima je mehanizam kojim se više metoda može definirati s istim imenom i potpisom u nadklasi i podklasi. Poziv nadjačane metode rješava se za vrijeme izvođenja putem dinamičkog povezivanja unutar JVM-a.

Primjer dinamičkog polimorfizma

Referentna varijabla nadklase može se odnositi na objekt podklase:

 Doctor obj = new Surgeon();

Razmotrite izjavu:

obj.treatPatient();

Ovdje je referentna varijabla obj pripada roditeljskoj klasi, ali objekt na koji pokazuje pripada podređenoj klasi, kao što je prikazano na dijagramu polimorfizma.

Poziv obj.treatPatient() izvršit će metodu treatPatient() podklase Surgeon. Kada se referenca osnovne klase koristi za pozivanje metode, JVM određuje metodu koja se poziva na temelju stvarnog objekta na koji referenca pokazuje. Iako obj je referenca na Doctor, poziva metodu Surgeon-a, jer pokazuje na objekt Surgeon. Odluka se donosi tijekom izvođenja, zbog čega se naziva Dinamički polimorfizam ili polimorfizam za vrijeme izvođenja.

Razlika između statičkog i dinamičkog polimorfizma

Statički polimorfizam u Java je vrsta polimorfizma koja prikuplja informacije za pozivanje metode tijekom kompilacije, dok je dinamički polimorfizam vrsta polimorfizma koja prikuplja informacije za pozivanje metode tijekom izvođenja.

Statički polimorfizam
Dinamički polimorfizam
To se odnosi na preopterećenje metoda. Odnosi se na nadjačavanje metode.
Greške, ako ih ima, rješavaju se tijekom kompajliranja. Budući da se kod ne izvršava tijekom kompajliranja, naziv je statičan.

ex:

void sum (int a , int b);
void sum (float a, double b);
int sum (int a, int b); //compiler gives error.
Kada referentna varijabla poziva nadjačanu metodu, metoda koja će se pozvati određena je objektom na koji referentna varijabla pokazuje. To se može odrediti samo za vrijeme izvođenja koda, zbog čega je naziv dinamičan.

ex:

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

Super ključna riječ u Java

Što ako metoda treatPatient u klasi Surgeon želi izvršiti funkcionalnost definiranu u klasi Doctor, a zatim izvesti vlastito specifično ponašanje? U ovom slučaju ključna riječ super može se koristiti za pristup metodama roditeljske klase iz podređene klase. Metoda treatPatient u klasi Surgeon mogla bi se napisati kao:

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

Ključna riječ super može se koristiti za pristup bilo kojem podatkovnom članu ili metodi nadklase unutar podklase. Zatim ćemo naučiti o ključnoj riječi super, Nasljeđivanjei polimorfizam u Java s primjerima programa.

Primjer: Učenje nasljeđivanja, polimorfizma i ključne riječi super

Korak 1) Kopirajte sljedeći kod u editor.

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

Korak 2) Spremite, kompajlirajte i pokrenite kod. Promatrajte izlaz.

Korak 3) Uklonite komentare iz redaka 6 do 9. Spremite, kompajlirajte i pokrenite kod. Promatrajte izlaz.

Korak 4) Odkomentirajte redak 10. Spremite i kompajlirajte kod.

Korak 5) Greška = ? To je zato što podklasa ne može pristupiti privatnim članovima nadklase.

Pitanja i odgovori

Polimorfizam u Java je sposobnost objekta da poprimi mnogo oblika. Isti naziv metode može pokrenuti različiti kod ovisno o tome na koji se objekt podklase referencira tijekom izvođenja, što je osnovno OOP ponašanje.

Java podržava polimorfizam za vrijeme kompajliranja putem preopterećenja metoda i polimorfizam za vrijeme izvođenja putem nadjačavanja metoda. Preopterećenje se rješava za vrijeme kompajliranja putem statičkog povezivanja, dok se nadjačavanje rješava za vrijeme izvođenja putem dinamičkog povezivanja kojim upravlja JVM.

Statičko vezanje povezuje poziv metode s njenom definicijom tijekom kompajliranja i koristi se za preopterećenje metoda. Dinamičko vezanje povezuje poziv tijekom izvođenja na temelju stvarnog tipa objekta i omogućuje nadjačavanje metoda. Java.

Ključna riječ super omogućuje podklasi pozivanje nadjačane metode ili pristup podatkovnom članu iz svoje roditeljske klase. To omogućuje podklasi da ponovno upotrijebi roditeljsku logiku, a zatim preko nje doda specijalizirano ponašanje.

AI tutori kao što su ChatGPT i GitHub Copilot Chat mogu objasniti polimorfizam u Java s prilagođenim analogijama, generirajte probleme za vježbu, prođite kroz stabla nasljeđivanja i provjeravajte učenike o statičkom povezivanju u odnosu na dinamičko povezivanje za brže savladavanje gradiva.

Da. Pomoćnici za refaktoriranje vođeni umjetnom inteligencijom poput Cursora, Sourcegrapha Codyja i IntelliJ AI Assistanta mogu uočiti duplicirane uvjetne izraze, predložiti hijerarhije klasa i prepisati naslijeđene kodove. Java kod tako da nadjačavanje metode zamjenjuje ponovljene if-else lance.

Sažmite ovu objavu uz: