Polymorfisme i Java (Statisk og dynamisk)

⚡ Smart oppsummering

Polymorfisme i Java lar ett grensesnitt representere mange former, slik at et enkelt metodenavn oppfører seg forskjellig på tvers av relaterte klasser. Det er en pilar innen objektorientert design som fremmer fleksibilitet, gjenbruk av kode og ren utvidelse av eldre bank-, medisinske og bedriftssystemer.

  • 🎭 Mange former, ett navn: Polymorfisme i Java lar samme metodenavn sende til forskjellige implementeringer basert på den faktiske objekttypen på utførelsestidspunktet.
  • 🔀 To smaker: Kompileringstidspolymorfisme bruker metodeoverbelastning, mens runtime-polymorfisme bruker metodeoverstyring gjennom arv og JVM.
  • ⛓️ Statisk vs. dynamisk binding: Overbelastede kall løses ved kompileringstid gjennom statisk binding, mens overstyrte kall løses ved kjøretid gjennom dynamisk binding.
  • Super søkeordkraft: Super-nøkkelordet lar en underklasse påkalle den overordnede implementeringen før den legger til sin egen spesialiserte oppførsel på toppen.
  • 🧪 Rekkevidde i den virkelige verden: Bankkontoer, hierarkier for sykehuspersonale og renderingsmotorer for former er alle avhengige av polymorfisme for å utvikle nye krav uten å bryte testet kode.

Polymorfisme i Java

Hva er polymorfisme i Java?

Polymorfisme i Java oppstår når en eller flere klasser eller objekter er relatert til hverandre gjennom arv. Det er et objekts evne til å ta mange former. Arv lar brukere arve attributter og metoder, og polymorfisme bruker disse metodene til å utføre forskjellige oppgaver. Målet er kommunikasjon, mens tilnærmingen kan variere.

For eksempel brukes en smarttelefon til kommunikasjon. Kommunikasjonsmåten kan være en samtale, en tekstmelding, en bildemelding eller en e-post. Målet er felles, det vil si kommunikasjon, men tilnærmingen er forskjellig. Denne oppførselen er essensen av polymorfismeNå skal vi lære om polymorfisme i Java med eksempelkode, diagrammer og trinnvise forklaringer.

Klikk her. hvis videoen ikke er tilgjengelig

Hvorfor bruke polymorfisme i Java?

Polymorfisme i Java brukes fordi det gjør kode fleksibel, gjenbrukbar og enklere å vedlikeholde. En enkelt referansevariabel av en overordnet type kan peke til flere underobjekter, slik at samme kall tilpasser seg hvilken som helst underklasse som leveres. Dette mønsteret holder testet kode urørt mens ny atferd legges til gjennom spesialiserte underklasser, og det er nettopp derfor rammeverk som Spring og Jakarta EE er avhengige av det.

Java Polymorfisme i OOP-er med eksempel

Tenk på én foreldreklasse som heter Konto med funksjoner for innskudd og uttak. Konto-klassen har to underklasser. Operasjonen for innskudd og uttak er den samme for sparekontoer og sjekkkontoer, så de arvede metodene fra Konto-klassen vil fungere.

Enkeltarv i Java

Java Eksempel på polymorfisme

Endring i programvarekrav

Det er en endring i kravspesifikasjonen, noe som er vanlig i programvarebransjen. Funksjonalitet for en privilegert bankkonto med overtrekksfasilitet må legges til. Overtrekk er en fasilitet der en kunde kan ta ut et beløp som er større enn den tilgjengelige saldoen på kontoen. Uttaksmetoden for den privilegerte kontoen trenger en ny implementering, mens den testede koden i spare- og sjekkkontoer forblir urørt. Denne isolasjonen er fordelen med OOPS.

Java polymorfisme

Trinn 1) Når uttaksmetoden for sparekontoen kalles, utføres metoden som er definert i den overordnede kontoklassen.

Java polymorfisme

Trinn 2) Når uttaksmetoden for den privilegerte kontoen (kassekreditt) kalles, utføres uttaksmetoden som er definert i den privilegerte klassen. Denne forsendelsen er Polymorfisme i OOP-er.

Java polymorfisme

Metode Overstyring inn Java

Metodeoverstyring er prosessen med å omdefinere en superklassemetode inne i en underklasse. Underklassen beholder de samme konfigurasjonene.tract, men leverer en ny implementering som velges når programmet kjører.

Regler for metodeoverstyring

  • Metodesignaturen, det vil si metodenavnet, parameterlisten og returtypen, må samsvare nøyaktig.
  • Den overstyrte metoden kan utvide tilgjengeligheten, men den kan ikke begrense den. Hvis metoden er privat i basisklassen, kan barneklassen gjøre den offentlig, men ikke omvendt.

Regler for metodeoverstyring inn Java

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

Forskjellen mellom metodeoverbelastning og metodeoverstyring

Metodeoverbelastning skjer innenfor samme klasse med samme metodenavn, men forskjellige signaturer. Metodeoverstyring skjer på tvers av et foreldre-barn-klasseforhold, der underklassen omdefinerer en metode deklarert i superklassen.

Metode Overbelastning
Metode Overstyring
Metodeoverbelastning er i samme klasse, der mer enn én metode har samme navn, men forskjellige signaturer. Metodeoverstyring er når en av metodene i superklassen omdefinertes i underklassen. I dette tilfellet forblir 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
 }
}

Hva er dynamisk polymorfisme?

Dynamisk polymorfisme i OOP-er er mekanismen der flere metoder kan defineres med samme navn og signatur i superklassen og underklassen. Kallet til en overstyrt metode løses under kjøretid gjennom dynamisk binding inne i JVM-en.

Eksempel på dynamisk polymorfisme

En referansevariabel i superklassen kan referere til et underklasseobjekt:

 Doctor obj = new Surgeon();

Tenk på utsagnet:

obj.treatPatient();

Her er referansevariabelen obj er av foreldreklassen, men objektet den peker til er av barneklassen, som vist i diagrammet for polymorfisme.

Samtalen obj.treatPatient() vil utføre treatPatient()-metoden til underklassen Surgeon. Når en referanse til en basisklasse brukes til å kalle en metode, bestemmes metoden som kalles av JVM-en basert på det faktiske objektet referansen peker til. Selv om obj er en referanse til Doktor, kaller den metoden Surgeon, fordi den peker til et Surgeon-objekt. Beslutningen tas under kjøretid, og det er derfor den kalles Dynamisk polymorfisme eller kjøretidspolymorfisme.

Forskjellen mellom statisk og dynamisk polymorfisme

Statisk polymorfisme i Java er en type polymorfisme som samler inn informasjonen for å kalle en metode ved kompileringstid, mens dynamisk polymorfisme er en type polymorfisme som samler inn informasjonen for å kalle en metode under kjøretid.

Statisk polymorfisme
Dynamisk polymorfisme
Det har med metodeoverbelastning å gjøre. Det gjelder metodeoverstyring.
Eventuelle feil løses ved kompilering. Siden koden ikke kjø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 referansevariabel kaller en overstyrt metode, bestemmes metoden som skal kalles av objektet referansevariabelen peker til. Dette kan bare bestemmes under kjøretid når koden er under utførelse, og det er derfor navnet er dynamisk.

ex:

//reference of parent pointing to child object
 Doctor obj = new Surgeon();
// method of child called
obj.treatPatient();

Super nøkkelord i Java

Hva om treatPatient-metoden i Surgeon-klassen ønsker å utføre funksjonaliteten som er definert i Doctor-klassen og deretter utføre sin egen spesifikke oppførsel? I dette tilfellet nøkkelordet super kan brukes til å få tilgang til metoder for overordnet klasse fra barneklassen. Behandlingspasientmetoden i Surgeon-klassen kan skrives som:

treatPatient(){
   super.treatPatient();
     //add code specific to Surgeon
}

Nøkkelordet super kan brukes til å få tilgang til ethvert datamedlem eller metode i superklassen i underklassen. Deretter skal vi lære om super-nøkkelordet, Arv, og polymorfisme i Java med eksempelprogrammer.

Eksempel: For å lære arv, polymorfisme og supernøkkelordet

Trinn 1) Kopier følgende kode inn 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");
      }
}

Trinn 2) Lagre, kompiler og kjør koden. Observer resultatet.

Trinn 3) Fjern kommenteringen fra linje 6 til 9. Lagre, kompiler og kjør koden. Observer resultatet.

Trinn 4) Fjern kommenteringen fra linje 10. Lagre og kompiler koden.

Trinn 5) Feil = ? Dette er fordi underklassen ikke har tilgang til private medlemmer av superklassen.

Spørsmål og svar

Polymorfisme i Java er et objekts evne til å anta mange former. Det samme metodenavnet kan kjøre forskjellig kode avhengig av hvilket underklasseobjekt som refereres til under kjøretid, som er den sentrale OOP-oppførselen.

Java støtter polymorfisme ved kompileringstid gjennom metodeoverbelastning og polymorfisme ved kjøretid gjennom metodeoverstyring. Overbelastning løses ved kompileringstid via statisk binding, mens overstyring løses ved kjøretid via dynamisk binding håndtert av JVM-en.

Statisk binding kobler et metodekall til definisjonen ved kompileringstid og brukes til metodeoverbelastning. Dynamisk binding kobler kallet ved kjøretid basert på den faktiske objekttypen og gir tilgang til metodeoverstyring i Java.

Super-nøkkelordet lar en underklasse kalle den overstyrte metoden eller få tilgang til et datamedlem fra den overordnede klassen. Dette lar barnet gjenbruke den overordnede logikken og deretter legge spesialisert atferd oppå den.

AI-veiledere som ChatGPT og GitHub Copilot Chat kan forklare polymorfisme i Java med tilpassede analogier, generer øvingsproblemer, gå gjennom arvstrær og spør elever om statisk binding versus dynamisk binding for raskere mestring.

Ja. AI-drevne refaktoreringsassistenter som Cursor, Sourcegraph Cody og IntelliJ AI Assistant kan oppdage dupliserte betingelsesverdier, foreslå klassehierarkier og omskrive eldre versjoner. Java kode slik at Method Overriding erstatter gjentatte if-else-kjeder.

Oppsummer dette innlegget med: