Polymorfism i Java (Statisk och dynamisk)
Vad är polymorfism i Java?
polymorfism in Java uppstår när det finns en eller flera klasser eller objekt relaterade till varandra genom arv. Det är ett objekts förmåga att ta många former. Arv låter användare ärva attribut och metoder, och polymorfism använder dessa metoder för att utföra olika uppgifter. Så målet är kommunikation, men tillvägagångssättet är annorlunda.
Till exempel har du en smartphone för kommunikation. Kommunikationsläget du väljer kan vara vad som helst. Det kan vara ett samtal, ett textmeddelande, ett bildmeddelande, e-post, etc. Så målet är vanligt, det är kommunikation, men deras tillvägagångssätt är annorlunda. Detta kallas Polymorfism. Nu ska vi lära oss polymorfism i Java med exempel.
Klicka här. om videon inte är tillgänglig
Java Polymorfism i OOPs med exempel
Vi har en förälderklass, 'Konto' med funktion av insättning och uttag. Kontot har 2 barnklasser. Funktionen för insättning och uttag är samma för spar- och checkkonton. Så de ärvda metoderna från kontoklassen kommer att fungera.
Ändring av mjukvarukrav
Det sker en förändring i kravspecifikationen, något som är så vanligt i mjukvarubranschen. Det är meningen att du ska lägga till funktionsprivilegierad bankkonto med kontokredit. Som bakgrund är övertrassering en möjlighet där du kan ta ut ett belopp som är mer än tillgängligt saldo på ditt konto. Så, dra tillbaka metoden för privilegierade behov att implementeras på nytt. Men du ändrar inte den testade kodbiten i Spar- och checkkonto. Detta är fördelen med HOPPSAN
Steg 1) Sådan att när den "uttagna" metoden för att spara konto kallas en metod från överordnad kontoklass exekveras
Steg 2) Men när "Uttag"-metoden för det privilegierade kontot (övertrasseringsmöjlighet) kallas uttagsmetoden som definieras i den privilegierade klassen exekveras. Detta är Polymorfism i OOPs.
Metod Åsidosättande in Java
Metodöverstyrning är att omdefiniera en superklassmetod i en underklass.
Regler för metodöverstyrning
- Metodsignaturen dvs metodnamn, parameterlista och returtyp måste matcha exakt.
- Den åsidosatta metoden kan vidga tillgängligheten men inte begränsa den, dvs om den är privat i basklassen kan barnklassen göra den offentlig men inte vice versa.
Exempelvis
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(); } }
Skillnaden mellan överbelastning och åsidosättande
Metodöverbelastning är i samma klass, där mer än en metod har samma namn men olika signaturer. | Metodöverstyrning är när en av metoderna i superklassen omdefinieras i underklassen. I det här fallet förblir metodens signatur densamma. |
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 } } |
Vad är dynamisk polymorfism?
Dynamisk polymorfism i OOPs är mekanismen genom vilken flera metoder kan definieras med samma namn och signatur i superklassen och underklassen. Anropet till en åsidosatt metod löses vid körning.
Exempel på dynamisk polymorfism:
En referensvariabel för superklassen kan referera till ett subklassobjekt
Doctor obj = new Surgeon();
Tänk på uttalandet
obj.treatPatient();
Här är referensvariabeln "obj" av den överordnade klassen, men objektet den pekar på är av den underordnade klassen (som visas i nedanstående diagramexempel av Polymorphism).
obj.treatPatient() kommer att köra treatPatient()-metoden för underklassen – Surgeon
Om en basklassreferens används för att anropa en metod, bestäms metoden som ska anropas av JVM, beroende på vilket objekt referensen pekar på
Till exempel, även om obj är en referens till Doctor, kallar den metoden för Surgeon, eftersom den pekar på ett Surgeon-objekt
Detta bestäms under körtiden och kallas därför dynamisk or run-time polymorfism
Skillnad mellan statisk och dynamisk polymorfism
Statisk polymorfism i Java är en typ av polymorfism som samlar in informationen för att anropa en metod vid kompileringstillfället, medan dynamisk polymorfism är en typ av polymorfism som samlar in informationen för att anropa en metod under körning.
Det handlar om metodöverbelastning. | Det handlar om metodöverstyrning. |
Eventuella fel åtgärdas vid kompileringstillfället. Eftersom koden inte exekveras under kompileringen, därav namnet static.
ex: void sum (int a , int b); void sum (float a, double b); int sum (int a, int b); //compiler gives error. |
Om en referensvariabel anropar en åsidosatt metod, bestäms metoden som ska anropas av det objekt som din referensvariabel pekar på. Detta kan endast bestämmas vid körning när koden körs, därav namnet dynamisk.
ex: //reference of parent pointing to child object Doctor obj = new Surgeon(); // method of child called obj.treatPatient(); |
Super sökord i Java
Vad händer om treatPatient-metoden i klassen Surgeon vill utföra den funktionalitet som definieras i klassen Doctor och sedan utföra sin egen specifika funktionalitet? I det här fallet nyckelord super
kan användas för att komma åt metoder för föräldraklassen från barnklassen. Behandlingspatientmetoden i klassen Surgeon kan skrivas som:
treatPatient(){ super.treatPatient(); //add code specific to Surgeon }
Nyckelordet super kan användas för att komma åt vilken datamedlem eller metoder som helst i superklassen i underklassen.
Därefter kommer vi att lära oss om Super nyckelord, Arv och polymorfism i Java med exempelprogram.
Exempel:-Att lära sig arv, polymorfism och supernyckelord
Steg 1) Kopiera följande kod till 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"); } }
Steg 2) Spara, kompilera och kör koden. Observera utgången.
Steg 3) Avkommentarer rad #6-9. Spara, kompilera och kör koden. Observera utgången.
Steg 4) Avkommentera rad #10. Spara och kompilera koden.
Steg 5) Fel = ? Detta beror på att underklassen inte kan komma åt privata medlemmar i superklassen.
Sammanfattning
- Polymorfism i objektorienterad programmering uppstår när det finns en eller flera klasser eller objekt som är relaterade till varandra genom arv. Det är ett objekts förmåga att ta många former.
- Metodöverstyrning är att omdefiniera en superklassmetod i en underklass.
- Dynamisk polymorfism i Java är mekanismen genom vilken flera metoder kan definieras med samma namn och signatur i superklassen och underklassen.
- Statisk polymorfism i Java är en typ av polymorfism som samlar in informationen för att anropa en metod vid kompileringstillfället, medan dynamisk polymorfism är en typ av polymorfism som samlar in informationen för att anropa en metod under körning.
- Super nyckelord kan användas för att komma åt metoder för den överordnade klassen från den underordnade klassen.