Polymorfisme i Java (Statisk og dynamisk)
⚡ Smart oppsummering
Polymorfisme i Java lar ett grensesnitt representere mange former, slik at et enkelt metodenavn oppfører seg forskjellig på tvers av relaterte klasser. Det er en pilar innen objektorientert design som fremmer fleksibilitet, gjenbruk av kode og ren utvidelse av eldre bank-, medisinske og bedriftssystemer.
Hva er polymorfisme i Java?
Polymorfisme i Java oppstår når en eller flere klasser eller objekter er relatert til hverandre gjennom arv. Det er et objekts evne til å ta mange former. Arv lar brukere arve attributter og metoder, og polymorfisme bruker disse metodene til å utføre forskjellige oppgaver. Målet er kommunikasjon, mens tilnærmingen kan variere.
For eksempel brukes en smarttelefon til kommunikasjon. Kommunikasjonsmåten kan være en samtale, en tekstmelding, en bildemelding eller en e-post. Målet er felles, det vil si kommunikasjon, men tilnærmingen er forskjellig. Denne oppførselen er essensen av polymorfismeNå skal vi lære om polymorfisme i Java med eksempelkode, diagrammer og trinnvise forklaringer.
Klikk her. hvis videoen ikke er tilgjengelig
Hvorfor bruke polymorfisme i Java?
Polymorfisme i Java brukes fordi det gjør kode fleksibel, gjenbrukbar og enklere å vedlikeholde. En enkelt referansevariabel av en overordnet type kan peke til flere underobjekter, slik at samme kall tilpasser seg hvilken som helst underklasse som leveres. Dette mønsteret holder testet kode urørt mens ny atferd legges til gjennom spesialiserte underklasser, og det er nettopp derfor rammeverk som Spring og Jakarta EE er avhengige av det.
Java Polymorfisme i OOP-er med eksempel
Tenk på én foreldreklasse som heter Konto med funksjoner for innskudd og uttak. Konto-klassen har to underklasser. Operasjonen for innskudd og uttak er den samme for sparekontoer og sjekkkontoer, så de arvede metodene fra Konto-klassen vil fungere.
Java Eksempel på polymorfisme
Endring i programvarekrav
Det er en endring i kravspesifikasjonen, noe som er vanlig i programvarebransjen. Funksjonalitet for en privilegert bankkonto med overtrekksfasilitet må legges til. Overtrekk er en fasilitet der en kunde kan ta ut et beløp som er større enn den tilgjengelige saldoen på kontoen. Uttaksmetoden for den privilegerte kontoen trenger en ny implementering, mens den testede koden i spare- og sjekkkontoer forblir urørt. Denne isolasjonen er fordelen med OOPS.
Trinn 1) Når uttaksmetoden for sparekontoen kalles, utføres metoden som er definert i den overordnede kontoklassen.
Trinn 2) Når uttaksmetoden for den privilegerte kontoen (kassekreditt) kalles, utføres uttaksmetoden som er definert i den privilegerte klassen. Denne forsendelsen er Polymorfisme i OOP-er.
Metode Overstyring inn Java
Metodeoverstyring er prosessen med å omdefinere en superklassemetode inne i en underklasse. Underklassen beholder de samme konfigurasjonene.tract, men leverer en ny implementering som velges når programmet kjører.
Regler for metodeoverstyring
- Metodesignaturen, det vil si metodenavnet, parameterlisten og returtypen, må samsvare nøyaktig.
- Den overstyrte metoden kan utvide tilgjengeligheten, men den kan ikke begrense den. Hvis metoden er privat i basisklassen, kan barneklassen gjøre den offentlig, men ikke omvendt.
Eksempel
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(); } }
Forskjellen mellom metodeoverbelastning og metodeoverstyring
Metodeoverbelastning skjer innenfor samme klasse med samme metodenavn, men forskjellige signaturer. Metodeoverstyring skjer på tvers av et foreldre-barn-klasseforhold, der underklassen omdefinerer en metode deklarert i superklassen.
| Metodeoverbelastning er i samme klasse, der mer enn én metode har samme navn, men forskjellige signaturer. | Metodeoverstyring er når en av metodene i superklassen omdefinertes i underklassen. I dette tilfellet forblir metodens signatur den samme. |
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 } } |
Hva er dynamisk polymorfisme?
Dynamisk polymorfisme i OOP-er er mekanismen der flere metoder kan defineres med samme navn og signatur i superklassen og underklassen. Kallet til en overstyrt metode løses under kjøretid gjennom dynamisk binding inne i JVM-en.
Eksempel på dynamisk polymorfisme
En referansevariabel i superklassen kan referere til et underklasseobjekt:
Doctor obj = new Surgeon();
Tenk på utsagnet:
obj.treatPatient();
Her er referansevariabelen obj er av foreldreklassen, men objektet den peker til er av barneklassen, som vist i diagrammet for polymorfisme.
Samtalen obj.treatPatient() vil utføre treatPatient()-metoden til underklassen Surgeon. Når en referanse til en basisklasse brukes til å kalle en metode, bestemmes metoden som kalles av JVM-en basert på det faktiske objektet referansen peker til. Selv om obj er en referanse til Doktor, kaller den metoden Surgeon, fordi den peker til et Surgeon-objekt. Beslutningen tas under kjøretid, og det er derfor den kalles Dynamisk polymorfisme eller kjøretidspolymorfisme.
Forskjellen mellom statisk og dynamisk polymorfisme
Statisk polymorfisme i Java er en type polymorfisme som samler inn informasjonen for å kalle en metode ved kompileringstid, mens dynamisk polymorfisme er en type polymorfisme som samler inn informasjonen for å kalle en metode under kjøretid.
| Det har med metodeoverbelastning å gjøre. | Det gjelder metodeoverstyring. |
| Eventuelle feil løses ved kompilering. Siden koden ikke kjøres under kompilering, er navnet statisk.
ex: void sum (int a , int b); void sum (float a, double b); int sum (int a, int b); //compiler gives error. |
Når en referansevariabel kaller en overstyrt metode, bestemmes metoden som skal kalles av objektet referansevariabelen peker til. Dette kan bare bestemmes under kjøretid når koden er under utførelse, og det er derfor navnet er dynamisk.
ex: //reference of parent pointing to child object Doctor obj = new Surgeon(); // method of child called obj.treatPatient(); |
Super nøkkelord i Java
Hva om treatPatient-metoden i Surgeon-klassen ønsker å utføre funksjonaliteten som er definert i Doctor-klassen og deretter utføre sin egen spesifikke oppførsel? I dette tilfellet nøkkelordet super kan brukes til å få tilgang til metoder for overordnet klasse fra barneklassen. Behandlingspasientmetoden i Surgeon-klassen kan skrives som:
treatPatient(){
super.treatPatient();
//add code specific to Surgeon
}
Nøkkelordet super kan brukes til å få tilgang til ethvert datamedlem eller metode i superklassen i underklassen. Deretter skal vi lære om super-nøkkelordet, Arv, og polymorfisme i Java med eksempelprogrammer.
Eksempel: For å lære arv, polymorfisme og supernøkkelordet
Trinn 1) Kopier følgende kode inn i en 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"); } }
Trinn 2) Lagre, kompiler og kjør koden. Observer resultatet.
Trinn 3) Fjern kommenteringen fra linje 6 til 9. Lagre, kompiler og kjør koden. Observer resultatet.
Trinn 4) Fjern kommenteringen fra linje 10. Lagre og kompiler koden.
Trinn 5) Feil = ? Dette er fordi underklassen ikke har tilgang til private medlemmer av superklassen.






