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: