Polymorfi i Java (Statisk og dynamisk)
โก Smart opsummering
Polymorfi i Java tillader รฉn grรฆnseflade at reprรฆsentere mange former, sรฅ et enkelt metodenavn opfรธrer sig forskelligt pรฅ tvรฆrs af relaterede klasser. Det er en sรธjle inden for objektorienteret design, der fremmer fleksibilitet, genbrug af kode og ren udvidelse af รฆldre bank-, medicinske og virksomhedssystemer.

Hvad er polymorfisme i Java?
Polymorfi i Java forekommer, nรฅr en eller flere klasser eller objekter er relateret til hinanden ved arv. Det er et objekts evne til at antage mange former. Arv lader brugere arve attributter og metoder, og polymorfisme bruger disse metoder til at udfรธre forskellige opgaver. Mรฅlet er kommunikation, mens tilgangen kan variere.
For eksempel bruges en smartphone til kommunikation. Kommunikationsmรฅden kan vรฆre et opkald, en sms, en billedbesked eller en e-mail. Mรฅlet er fรฆlles, det vil sige kommunikation, men tilgangen er forskellig. Denne adfรฆrd er essensen af polymorfiNu skal vi lรฆre om polymorfi i Java med eksempelkode, diagrammer og trinvise forklaringer.
Klik link. hvis videoen ikke er tilgรฆngelig
Hvorfor bruge polymorfi i Java?
Polymorfi i Java bruges fordi det gรธr kode fleksibel, genanvendelig og nemmere at vedligeholde. En enkelt referencevariabel af en overordnet type kan pege pรฅ flere underordnede objekter, sรฅ det samme kald tilpasser sig den underklasse, der leveres. Dette mรธnster holder testet kode uberรธrt, mens ny adfรฆrd tilfรธjes gennem specialiserede underklasser, hvilket netop er grunden til, at frameworks som Spring og Jakarta EE er afhรฆngige af det.
Java Polymorfi i OOP'er med eksempel
Overvej รฉn overordnet klasse ved navn Konto med funktioner til indbetaling og udbetaling. Konto-klassen har to underklasser. Funktionen ved indbetaling og udbetaling er den samme for opsparings- og checkkonti, sรฅ de nedarvede metoder fra Konto-klassen vil fungere.
Java Eksempel pรฅ polymorfi
รndring i softwarekrav
Der er en รฆndring i kravspecifikationen, noget der er almindeligt i softwarebranchen. Funktionalitet til en privilegeret bankkonto med overtrรฆksfacilitet skal tilfรธjes. Overtrรฆk er en facilitet, hvor en kunde kan hรฆve et belรธb, der er stรธrre end den disponible saldo pรฅ kontoen. Hรฆvemetoden for den privilegerede konto skal implementeres pรฅ ny, mens den testede kode i opsparings- og checkkonti forbliver uรฆndret. Denne isolation er fordelen ved OOPS.
Trin 1) Nรฅr udbetalingsmetoden for opsparingskontoen kaldes, udfรธres den metode, der er defineret i den overordnede Account-klasse.
Trin 2) Nรฅr hรฆvemetoden for den privilegerede konto (kassekredit) kaldes, udfรธres den hรฆvemetode, der er defineret i den privilegerede klasse. Denne forsendelse er Polymorfi i OOP'er.
Metode Tilsidesรฆttelse af ind Java
Metodeoverstyring er processen med at omdefinere en superklassemetode inden for en underklasse. Underklassen beholder de samme betingelsertract, men leverer en frisk implementering, der vรฆlges, nรฅr programmet kรธrer.
Regler for metodetilsidesรฆttelse
- Metodesignaturen, dvs. metodenavnet, parameterlisten og returtypen, skal stemme nรธjagtigt overens.
- Den overstyrede metode kan udvide tilgรฆngeligheden, men den kan ikke indsnรฆvre den. Hvis metoden er privat i basisklassen, kan underklassen gรธ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(); } }
Forskellen mellem metodeoverbelastning og metodeoverstyring
Metodeoverbelastning sker inden for den samme klasse med samme metodenavn, men forskellige signaturer. Metodeoverstyring sker pรฅ tvรฆrs af en forรฆldre-barn-klasserelation, hvor underklassen omdefinerer en metode, der er deklareret i superklassen.
| Metodeoverbelastning er i samme klasse, hvor mere end รฉn metode har samme navn men forskellige signaturer. | Metodeoverstyring er, nรฅr en af โโmetoderne i superklassen omdefineres i underklassen. I dette tilfรฆlde forbliver 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 } } |
Hvad er dynamisk polymorfisme?
Dynamisk polymorfi i OOP'er er den mekanisme, hvorved flere metoder kan defineres med samme navn og signatur i superklassen og underklassen. Kaldet til en overskrevet metode lรธses under kรธrsel via dynamisk binding i JVM'en.
Eksempel pรฅ dynamisk polymorfi
En referencevariabel i superklassen kan referere til et underklasseobjekt:
Doctor obj = new Surgeon();
Overvej udsagnet:
obj.treatPatient();
Her er referencevariablen obj er af forรฆldreklassen, men det objekt, den peger pรฅ, er af underklassen, som vist i diagrammet for polymorfi.
Opkaldet obj.treatPatient() vil udfรธre treatPatient()-metoden fra underklassen Surgeon. Nรฅr en basisklassereference bruges til at kalde en metode, bestemmes den metode, der kaldes, af JVM'en baseret pรฅ det faktiske objekt, som referencen peger pรฅ. Selvom obj er en reference til Doktor, kalder den metoden Surgeon, fordi den peger pรฅ et Surgeon-objekt. Beslutningen trรฆffes under kรธrsel, hvilket er grunden til, at den kaldes Dynamisk polymorfisme eller runtime-polymorfisme.
Forskellen mellem statisk og dynamisk polymorfisme
Statisk polymorfisme i Java er en type polymorfi, der indsamler informationen til kald af en metode pรฅ kompileringstidspunktet, mens dynamisk polymorfi er en type polymorfi, der indsamler informationen til kald af en metode under kรธrsel.
| Det handler om metodeoverbelastning. | Det relaterer sig til metodeoverstyring. |
| Eventuelle fejl lรธses under kompilering. Da koden ikke udfรธ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 referencevariabel kalder en overskrevet metode, bestemmes den metode, der skal kaldes, af det objekt, som referencevariablen peger pรฅ. Dette kan kun bestemmes under kรธrsel, nรฅr koden er under udfรธrelse, hvilket er grunden til, at navnet er dynamisk.
ex: //reference of parent pointing to child object Doctor obj = new Surgeon(); // method of child called obj.treatPatient(); |
Super sรธgeord i Java
Hvad hvis treatPatient-metoden i Surgeon-klassen รธnsker at udfรธre den funktionalitet, der er defineret i Doctor-klassen, og derefter udfรธre sin egen specifikke adfรฆrd? I dette tilfรฆlde nรธgleordet super kan bruges til at fรฅ adgang til metoder for forรฆldreklassen fra underklassen. TreatPatient-metoden i Surgeon-klassen kunne skrives som:
treatPatient(){
super.treatPatient();
//add code specific to Surgeon
}
Nรธgleordet super kan bruges til at tilgรฅ ethvert datamedlem eller enhver metode i superklassen inden for underklassen. Dernรฆst vil vi lรฆre om super-nรธgleordet, Arvog polymorfi i Java med eksempelprogrammer.
Eksempel: At lรฆre arv, polymorfi og super-nรธgleordet
Trin 1) Kopier fรธlgende kode ind 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"); } }
Trin 2) Gem, kompiler og kรธr koden. Observer outputtet.
Trin 3) Fjern kommentaren fra linje 6 til 9. Gem, kompiler og kรธr koden. Observer outputtet.
Trin 4) Fjern kommentar fra linje 10. Gem og kompiler koden.
Trin 5) Fejl = ? Dette skyldes, at underklassen ikke kan fรฅ adgang til private medlemmer af superklassen.





