Polymorfism i Java (Statisk och dynamisk)

⚡ Smart sammanfattning

Polymorfism i Java tillåter ett gränssnitt att representera många former, så ett enda metodnamn beter sig olika mellan relaterade klasser. Det är en grundpelare inom objektorienterad design som främjar flexibilitet, återanvändning av kod och ren utbyggnad av äldre bank-, medicinska och företagssystem.

  • 🎭 Många former, ett namn: Polymorfism i Java låter samma metodnamn skickas till olika implementationer baserat på den faktiska objekttypen vid exekveringstillfället.
  • 🔀 Två smaker: Kompileringstidspolymorfism använder Method Overloading, medan runtime-polymorfism använder Method Overriding genom arv och JVM.
  • ⛓️ Statisk vs. dynamisk bindning: Överbelastade anrop löses vid kompileringstid genom statisk bindning, medan åsidosatta anrop löses vid körning genom dynamisk bindning.
  • Superkraften hos sökordet: Nyckelordet super låter en underklass anropa den överordnade implementeringen innan den lägger till sitt eget specialiserade beteende ovanpå.
  • 🧪 Räckvidd i verkligheten: Bankkonton, sjukhuspersonalhierarkier och formrenderingsmotorer förlitar sig alla på polymorfism för att skapa nya krav utan att bryta mot testad kod.

Polymorfism i Java

Vad är polymorfism i Java?

Polymorfism i Java inträffar när en eller flera klasser eller objekt är relaterade till varandra genom arv. Det är ett objekts förmåga att anta 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. Målet är kommunikation, medan tillvägagångssättet kan variera.

Till exempel används en smartphone för kommunikation. Kommunikationssättet kan vara ett samtal, ett textmeddelande, ett bildmeddelande eller ett e-postmeddelande. Målet är gemensamt, det vill säga kommunikation, men tillvägagångssättet är annorlunda. Detta beteende är essensen av polymorfismNu ska vi lära oss polymorfism i Java med exempelkod, diagram och steg-för-steg-förklaringar.

Klicka här. om videon inte är tillgänglig

Varför använda polymorfism i Java?

Polymorfism i Java används eftersom det gör kod flexibel, återanvändbar och enklare att underhålla. En enda referensvariabel av en föräldertyp kan peka på flera underobjekt, så samma anrop anpassar sig till vilken underklass som helst som anges. Detta mönster håller testad kod orörd medan nytt beteende läggs till genom specialiserade underklasser, vilket är just därför ramverk som Spring och Jakarta EE är beroende av det.

Java Polymorfism i OOPs med exempel

Betrakta en förälderklass som heter Min sida med funktioner för insättning och uttag. Klassen Konto har två underklasser. Funktionen för insättning och uttag är densamma för spar- och checkkonton, så de ärvda metoderna från klassen Konto kommer att fungera.

Enstaka arv i Java

Java Exempel på polymorfism

Ändring av mjukvarukrav

Det sker en förändring i kravspecifikationen, något som är vanligt inom mjukvaruindustrin. Funktionalitet för ett privilegierat bankkonto med övertrassering måste läggas till. Övertrassering är en möjlighet där en kund kan ta ut ett belopp som är större än det tillgängliga saldot på kontot. Uttagsmetoden för det privilegierade kontot behöver en ny implementering, medan den testade koden i spar- och checkkonton lämnas orörd. Den isoleringen är fördelen med HOPPSAN.

Java polymorfism

Steg 1) När uttagsmetoden för sparkontot anropas, körs metoden som definierats i den överordnade klassen Konto.

Java polymorfism

Steg 2) När uttagsmetoden för det privilegierade kontot (övertrasseringen) anropas, utförs uttagsmetoden som definierats i den privilegierade klassen. Denna avsändning är Polymorfism i OOP:er.

Java polymorfism

Metod Åsidosättande in Java

Metodöverstyrning är processen att omdefiniera en superklassmetod inuti en underklass. Underklassen behåller samma bestämmelser.tract, men tillhandahåller en ny implementering som väljs när programmet körs.

Regler för metodöverstyrning

  • Metodsignaturen, det vill säga metodnamnet, parameterlistan och returtypen, måste matcha exakt.
  • Den åsidosatta metoden kan bredda tillgängligheten, men den kan inte begränsa den. Om metoden är privat i basklassen kan underklassen göra den publik men inte tvärtom.

Regler för metodöverstyrning Java

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 metodöverbelastning och metodöverstyrning

Metodöverbelastning sker inom samma klass med samma metodnamn men olika signaturer. Metodöverstyrning sker över en förälder-barn-klassrelation, där underklassen omdefinierar en metod som deklarerats i superklassen.

Metod överbelastning
Metod Åsidosättande
Metodöverbelastning ingå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 detta fall 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 OOP:er är den mekanism 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 genom dynamisk bindning inuti JVM:n.

Exempel på dynamisk polymorfism

En referensvariabel i superklassen kan referera till ett underklassobjekt:

 Doctor obj = new Surgeon();

Betrakta påståendet:

obj.treatPatient();

Här är referensvariabeln obj är av förälderklassen, men objektet den pekar på är av underklassen, som visas i diagrammet för polymorfism.

Samtalet obj.treatPatient() kommer att köra metoden treatPatient() från underklassen Surgeon. När en basklassreferens används för att anropa en metod, bestäms vilken metod som anropas av JVM:n baserat på det faktiska objektet som referensen pekar på. Även om obj är en referens till Doktor, kallar den metoden Surgeon, eftersom den pekar på ett Surgeon-objekt. Beslutet fattas under körning, vilket är anledningen till att det kallas Dynamisk polymorfism eller runtime-polymorfism.

Skillnaden 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 kompileringstid, medan dynamisk polymorfism är en typ av polymorfism som samlar in informationen för att anropa en metod vid körning.

Statisk polymorfism
Dynamisk polymorfism
Det relaterar till metodöverbelastning. Det relaterar till metodöverstyrning.
Eventuella fel åtgärdas vid kompileringstillfället. Eftersom koden inte körs under kompilering är namnet statiskt.

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 referensvariabel anropar en overridden-metod bestäms metoden som ska anropas av det objekt som referensvariabeln pekar på. Detta kan bara bestämmas vid körning när koden körs, vilket är anledningen till att namnet är dynamiskt.

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 metoden treatPatient i Surgeon-klassen vill utföra den funktionalitet som definierats i Doctor-klassen och sedan utföra sitt eget specifika beteende? I det här fallet är nyckelordet 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 valfri datamedlem eller metod i superklassen inom underklassen. Härnäst ska vi lära oss om nyckelordet super, Arvoch polymorfism i Java med exempelprogram.

Exempel: För att lära sig arv, polymorfism och supernyckelordet

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(){
            // 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");
      }
}

Steg 2) Spara, kompilera och kör koden. Observera utdata.

Steg 3) Avkommentera raderna 6 till 9. Spara, kompilera och kör koden. Observera utdata.

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.

Vanliga frågor

Polymorfism i Java är ett objekts förmåga att anta många former. Samma metodnamn kan köra olika kod beroende på vilket underklassobjekt som refereras till vid körning, vilket är det centrala OOP-beteendet.

Java stöder polymorfism vid kompileringstid genom metodöverbelastning och polymorfism vid körning genom metodöverbelastning. Överbelastning löses vid kompileringstid via statisk bindning, medan overriding löses vid körning via dynamisk bindning som hanteras av JVM:n.

Statisk bindning länkar ett metodanrop till dess definition vid kompileringstid och används för metodöverbelastning. Dynamisk bindning länkar anropet vid körning baserat på den faktiska objekttypen och ger metodöverstyrning i Java.

Nyckelordet super låter en underklass anropa den overridden-metoden eller komma åt en datamedlem från dess överordnade klass. Detta gör att underklassen kan återanvända den överordnade logiken och sedan lägga till specialiserat beteende ovanpå den.

AI-handledare som ChatGPT och GitHub Copilot Chat kan förklara polymorfism i Java med anpassade analogier, generera övningsproblem, gå igenom arvsträd och frågesportera elever om statisk bindning kontra dynamisk bindning för snabbare bemästring.

Ja. AI-drivna refaktoreringsassistenter som Cursor, Sourcegraph Cody och IntelliJ AI Assistant kan upptäcka duplicerade villkor, föreslå klasshierarkier och skriva om äldre versioner. Java kod så att Method Overriding ersätter upprepade if-else-kedjor.

Sammanfatta detta inlägg med: