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.

  • ๐ŸŽญ Mange former, รฉt navn: Polymorfi i Java lader det samme metodenavn sendes til forskellige implementeringer baseret pรฅ den faktiske objekttype pรฅ udfรธrelsestidspunktet.
  • ๐Ÿ”€ To smagsvarianter: Kompileringstidspolymorfisme bruger Method Overloading, mens runtime-polymorfisme bruger Method Overriding gennem arv og JVM.
  • โ›“๏ธ Statisk vs. dynamisk binding: Overbelastede kald lรธses ved kompileringstid via statisk binding, mens tilsidesatte kald lรธses ved kรธrselstid via dynamisk binding.
  • โœ… Super sรธgeordskraft: Super-nรธgleordet lader en underklasse kalde den overordnede implementering, fรธr den tilfรธjer sin egen specialiserede adfรฆrd ovenpรฅ.
  • ๐Ÿงช Virkelig rรฆkkevidde: Bankkonti, hospitalspersonales hierarkier og formgengivelsesmotorer er alle afhรฆngige af polymorfi for at kunne udvikle nye krav uden at รธdelรฆgge testet kode.

Polymorfi i Java

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.

Enkeltarv i Java

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.

Java polymorfi

Trin 1) Nรฅr udbetalingsmetoden for opsparingskontoen kaldes, udfรธres den metode, der er defineret i den overordnede Account-klasse.

Java polymorfi

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.

Java polymorfi

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.

Regler for metodetilsidesรฆttelse 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();
  }
}

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.

Metode Overbelastning
Metode tilsidesรฆttelse
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.

Statisk polymorfisme
Dynamisk polymorfisme
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.

Ofte Stillede Spรธrgsmรฅl

Polymorfi i Java er et objekts evne til at antage mange former. Det samme metodenavn kan kรธre forskellig kode afhรฆngigt af hvilket underklasseobjekt der refereres til under kรธrsel, hvilket er den centrale OOP-adfรฆrd.

Java understรธtter polymorfi ved kompilering via Method Overloading og polymorfi ved kรธrsel via Method Overriding. Overloading lรธses ved kompilering via statisk binding, mens Overriding lรธses ved kรธrsel via dynamisk binding hรฅndteret af JVM'en.

Statisk binding forbinder et metodekald til dets definition pรฅ kompileringstidspunktet og bruges til metodeoverbelastning. Dynamisk binding forbinder kaldet under kรธrsel baseret pรฅ den faktiske objekttype og aktiverer metodeoverstyring i Java.

Super-nรธgleordet lader en underklasse kalde den overridden-metode eller tilgรฅ et datamedlem fra dens overordnede klasse. Dette giver barnet mulighed for at genbruge den overordnede logik og derefter lรฆgge specialiseret adfรฆrd oven pรฅ den.

AI-undervisere som ChatGPT og GitHub Copilot Chat kan forklare polymorfi i Java med brugerdefinerede analogier, generer รธvelsesproblemer, gennemgรฅ arvstrรฆer og quiz elever om statisk binding versus dynamisk binding for hurtigere mestring.

Ja. AI-drevne refaktoreringsassistenter som Cursor, Sourcegraph Cody og IntelliJ AI Assistant kan finde duplikerede betingelsesvรฆrdier, foreslรฅ klassehierarkier og omskrive รฆldre versioner. Java kode sรฅ Method Overriding erstatter gentagne if-else-kรฆder.

Opsummer dette indlรฆg med: