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.

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.
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.
Korak 1) Kada se pozove metoda isplate za Štedni račun, izvršava se metoda definirana u roditeljskoj klasi Račun.
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.
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.
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 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.
| 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.





