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.






