Polymorfi i Java (Statisk og dynamisk)
Hvad er polymorfisme i Java?
polymorfi in Java opstår, når der er en eller flere klasser eller objekter relateret til hinanden ved arv. Det er et objekts evne til at antage mange former. Nedarvning lader brugere arve attributter og metoder, og polymorfi bruger disse metoder til at udføre forskellige opgaver. Så målet er kommunikation, men tilgangen er anderledes.
For eksempel har du en smartphone til kommunikation. Den kommunikationstilstand, du vælger, kan være hvad som helst. Det kan være et opkald, en sms, en billedbesked, mail osv. Så målet er fælles, det er kommunikation, men deres tilgang er anderledes. Dette kaldes Polymorfi. Nu vil vi lære polymorfi i Java med eksempel.
Klik link. hvis videoen ikke er tilgængelig
Java Polymorfi i OOP'er med eksempel
Vi har én forældreklasse, 'Konto' med funktion af ind- og udbetaling. Kontoen har 2 børneklasser. Betjeningen af ind- og udbetaling er den samme for opsparings- og checkkonti. Så de nedarvede metoder fra kontoklassen vil fungere.
Ændring i softwarekrav
Der er en ændring i kravspecifikationen, noget der er så almindeligt i softwareindustrien. Det er meningen, at du skal tilføje funktionalitetsprivilegeret bankkonto med kassekredit. For en baggrund er kassekredit en facilitet, hvor du kan hæve et beløb, der er mere end tilgængeligt saldo på din konto. Så tilbagetræk metode for privilegerede behov implementeret på ny. Men du ændrer ikke det testede stykke kode i opsparings- og checkkonto. Dette er fordelen ved OOPS
Trin 1) Sådan, at når den "udtrukne" metode til at spare konto kaldes, udføres en metode fra overordnet kontoklasse
Trin 2) Men når "Udtræk"-metoden for den privilegerede konto (overtræksfacilitet) kaldes, udføres udbetalingsmetoden defineret i den privilegerede klasse. Dette er Polymorfi i OOP'er.
Metode Tilsidesættelse af ind Java
Metodetilsidesættelse er at omdefinere en superklassemetode i en underklasse.
Regler for metodetilsidesættelse
- Metodens signatur, dvs. metodenavn, parameterliste og returtype, skal matche nøjagtigt.
- Den tilsidesatte metode kan udvide tilgængeligheden, men ikke indsnævre den, dvs. hvis den er privat i basisklassen, kan børneklassen 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 overbelastning og tilsidesættelse
Metodeoverbelastning er i samme klasse, hvor mere end én metode har samme navn, men forskellige signaturer. | Metodetilsidesættelse 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 tilsidesat metode løses ved kørsel.
Eksempel på dynamisk polymorfi:
En referencevariabel for superklassen kan referere til et underklasseobjekt
Doctor obj = new Surgeon();
Overvej udsagnet
obj.treatPatient();
Her er referencevariablen "obj" af den overordnede klasse, men objektet, den peger på, er af den underordnede klasse (som vist i nedenstående diagrameksempel af Polymorphism).
obj.treatPatient() vil udføre treatPatient()-metoden for underklassen – Surgeon
Hvis en basisklassereference bruges til at kalde en metode, bestemmes metoden, der skal påberåbes af JVM, afhængigt af det objekt, referencen peger på
For eksempel, selvom obj er en reference til Doctor, kalder den metoden Surgeon, da den peger på et Surgeon-objekt
Dette afgøres i løbet af køretiden og betegnes derfor dynamisk or run-time polymorfi
Forskellen mellem statisk og dynamisk polymorfi
Statisk polymorfisme i Java er en type polymorfi, der indsamler informationen til at kalde en metode på kompileringstidspunktet, hvorimod dynamisk polymorfi er en type polymorfi, der indsamler informationen til at kalde en metode under kørsel.
Det vedrører metodeoverbelastning. | Det vedrører metodetilsidesættelse. |
Eventuelle fejl bliver løst på kompileringstidspunktet. Da koden ikke udføres under kompilering, derfor navnet static.
ex: void sum (int a , int b); void sum (float a, double b); int sum (int a, int b); //compiler gives error. |
Hvis en referencevariabel kalder en tilsidesat metode, bestemmes metoden, der skal aktiveres, af det objekt, som din referencevariabel peger på. Dette kan kun bestemmes under kørsel, når koden er under udførelse, deraf navnet 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 funktionalitet? I dette tilfælde søgeord 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 få adgang til ethvert datamedlem eller metoder i superklassen i underklassen.
Dernæst vil vi lære om Super søgeord, Arv og polymorfi i Java med eksempelprogrammer.
Eksempel:-At lære arv, polymorfi og supersøgeord
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(){ // overriden 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, kompilér og kør koden. Observer outputtet.
Trin 3) Fjern kommentarer til linje #6-9. Gem, kompilér og kør koden. Observer outputtet.
Trin 4) Fjern kommentar linje #10. Gem og kompilér koden.
Trin 5) Fejl = ? Dette skyldes, at underklassen ikke kan få adgang til private medlemmer af superklassen.
Resumé
- Polymorfi i objektorienteret programmering opstår, når der er en eller flere klasser eller objekter relateret til hinanden ved nedarvning. Det er et objekts evne til at antage mange former.
- Metodetilsidesættelse er at omdefinere en superklassemetode i en underklasse.
- Dynamisk polymorfisme i Java er den mekanisme, hvorved flere metoder kan defineres med samme navn og signatur i superklassen og underklassen.
- Statisk polymorfisme i Java er en type polymorfi, der indsamler informationen til at kalde en metode på kompileringstidspunktet, hvorimod dynamisk polymorfi er en type polymorfi, der indsamler informationen til at kalde en metode under kørsel.
- Supernøgleord kan bruges til at få adgang til metoder for forældreklassen fra underklassen.