Polymorphismus in Java (Statisch und Dynamisch)

⚡ Intelligente Zusammenfassung

Polymorphismus in Java Dies ermöglicht es, mit einer einzigen Schnittstelle viele verschiedene Formen abzubilden, sodass sich ein einzelner Methodenname in verwandten Klassen unterschiedlich verhält. Es ist ein Grundpfeiler des objektorientierten Designs und fördert Flexibilität, Code-Wiederverwendung und die einfache Erweiterung bestehender Bank-, Medizin- und Unternehmenssysteme.

  • 🎭 Viele Formen, ein Name: Polymorphismus in Java ermöglicht es, dass dieselbe Methode je nach dem tatsächlichen Objekttyp zur Laufzeit an unterschiedliche Implementierungen weitergeleitet wird.
  • 🔀 Zwei Geschmacksrichtungen: Bei der Kompilierzeit-Polymorphie wird Methodenüberladung verwendet, während bei der Laufzeit-Polymorphie Methodenüberschreibung durch Vererbung und die JVM zum Einsatz kommt.
  • ⛓️ Statische vs. dynamische Bindung: Überladene Aufrufe werden zur Kompilierzeit durch statische Bindung aufgelöst, während überschriebene Aufrufe zur Laufzeit durch dynamische Bindung aufgelöst werden.
  • ✅ Super Keyword Power: Das Schlüsselwort „super“ ermöglicht es einer Unterklasse, die Implementierung der Elternklasse aufzurufen, bevor sie ihr eigenes spezialisiertes Verhalten hinzufügt.
  • 🧪 Reichweite in der realen Welt: Bankkonten, Hierarchien des Krankenhauspersonals und Formendarstellungs-Engines basieren alle auf Polymorphie, um neue Anforderungen zu erfüllen, ohne getesteten Code zu beeinträchtigen.

Polymorphismus in Java

Was ist Polymorphismus in Java?

Polymorphismus in Java Polymorphismus tritt auf, wenn eine oder mehrere Klassen oder Objekte durch Vererbung miteinander verwandt sind. Er beschreibt die Fähigkeit eines Objekts, verschiedene Formen anzunehmen. Vererbung ermöglicht es Benutzern, Attribute und Methoden zu erben, und Polymorphismus nutzt diese Methoden, um unterschiedliche Aufgaben zu erfüllen. Ziel ist die Kommunikation, wobei die Vorgehensweise variieren kann.

Ein Smartphone wird beispielsweise zur Kommunikation genutzt. Die Kommunikationsform kann ein Anruf, eine SMS, eine MMS oder eine E-Mail sein. Das Ziel ist dasselbe – Kommunikation –, aber die Vorgehensweise ist unterschiedlich. Dieses Verhalten ist das Wesen von PolymorphieNun werden wir den Polymorphismus in Java mit Beispielcode, Diagrammen und schrittweisen Erklärungen.

Klicken Sie auf werden auf dieser Seite erläutert wenn das Video nicht zugänglich ist

Warum Polymorphismus verwenden in Java?

Polymorphismus in Java Dieses Muster wird verwendet, weil es Code flexibel, wiederverwendbar und wartungsfreundlicher macht. Eine einzelne Referenzvariable eines übergeordneten Typs kann auf mehrere untergeordnete Objekte verweisen, sodass derselbe Aufruf sich an die jeweilige Unterklasse anpasst. Dieses Muster hält getesteten Code unverändert, während neues Verhalten durch spezialisierte Unterklassen hinzugefügt wird. Genau deshalb basieren Frameworks wie Spring und Jakarta EE darauf.

Java Polymorphismus in OOPs mit Beispiel

Betrachten wir eine Elternklasse namens Konto Die Klasse „Account“ verfügt über Funktionen für Ein- und Auszahlungen und hat zwei Unterklassen. Da die Ein- und Auszahlungsvorgänge für Spar- und Girokonten identisch sind, funktionieren die von der Klasse „Account“ geerbten Methoden.

Einzelvererbung in Java

Java Beispiel für Polymorphismus

Änderung der Softwareanforderungen

Es gibt eine Änderung in der Anforderungsspezifikation, was in der Softwarebranche üblich ist. Die Funktionalität für ein privilegiertes Bankkonto mit Überziehungsmöglichkeit muss hinzugefügt werden. Ein Überziehungskredit ermöglicht es Kunden, einen Betrag abzuheben, der den verfügbaren Kontostand übersteigt. Die Abhebungsmethode für das privilegierte Konto muss neu implementiert werden, während der getestete Code für Spar- und Girokonten unverändert bleibt. Diese Trennung ist der Vorteil von HOPPLA.

Java Polymorphie

Schritt 1) Wenn die Auszahlungsmethode für das Sparkonto aufgerufen wird, wird die in der übergeordneten Kontoklasse definierte Methode ausgeführt.

Java Polymorphie

Schritt 2) Wird die Auszahlungsmethode für das privilegierte Konto (Überziehungskredit) aufgerufen, wird die in der privilegierten Klasse definierte Auszahlungsmethode ausgeführt. Dieser Dispatch ist Polymorphismus in OOPs.

Java Polymorphie

Methodenüberschreibung in Java

Methodenüberschreibung ist der Prozess, eine Methode einer Oberklasse innerhalb einer Unterklasse neu zu definieren. Die Unterklasse behält dabei ihre ursprüngliche Konfiguration bei.tract, sondern stellt eine neue Implementierung bereit, die beim Programmstart ausgewählt wird.

Regeln für das Überschreiben von Methoden

  • Die Methodensignatur, also Methodenname, Parameterliste und Rückgabetyp, muss exakt übereinstimmen.
  • Die überschriebene Methode kann die Zugänglichkeit erweitern, aber nicht einschränken. Wenn die Methode in der Basisklasse privat ist, kann die abgeleitete Klasse sie öffentlich machen, aber nicht umgekehrt.

Regeln für das Überschreiben von Methoden in Java

Beispiel

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

Unterschied zwischen Methodenüberladung und Methodenüberschreibung

Methodenüberladung findet innerhalb derselben Klasse mit demselben Methodennamen, aber unterschiedlichen Signaturen statt. Methodenüberschreibung hingegen findet in einer Eltern-Kind-Beziehung statt, wobei die Unterklasse eine in der Oberklasse deklarierte Methode neu definiert.

Methodenüberladung
Methodenüberschreibung
Methodenüberladung liegt in derselben Klasse vor, wenn mehrere Methoden denselben Namen, aber unterschiedliche Signaturen haben. Methodenüberschreibung bedeutet, dass eine Methode der Oberklasse in der Unterklasse neu definiert wird. Die Signatur der Methode bleibt dabei unverändert.
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
 }
}

Was ist dynamischer Polymorphismus?

Dynamischer Polymorphismus in der objektorientierten Programmierung (OOP) ist der Mechanismus, mit dem mehrere Methoden mit demselben Namen und derselben Signatur in der Ober- und Unterklasse definiert werden können. Der Aufruf einer überschriebenen Methode wird zur Laufzeit durch dynamische Bindung innerhalb der JVM aufgelöst.

Beispiel für dynamischen Polymorphismus

Eine Referenzvariable der Oberklasse kann auf ein Objekt der Unterklasse verweisen:

 Doctor obj = new Surgeon();

Betrachten Sie die folgende Aussage:

obj.treatPatient();

Hier die Referenzvariable obj ist von der Elternklasse, aber das Objekt, auf das es zeigt, ist von der Kindklasse, wie im Diagramm der Polymorphie dargestellt.

Der Anruf obj.treatPatient() wird die Methode `treatPatient()` der Unterklasse `Surgeon` ausführen. Wenn eine Basisklassenreferenz zum Aufruf einer Methode verwendet wird, bestimmt die JVM anhand des Objekts, auf das die Referenz verweist, welche Methode aufgerufen wird. Auch wenn obj Es handelt sich um eine Referenz auf Doctor; die Methode wird von Surgeon aufgerufen, da sie auf ein Surgeon-Objekt verweist. Die Entscheidung wird zur Laufzeit getroffen, daher die Bezeichnung. Dynamischer Polymorphismus oder Laufzeitpolymorphismus.

Unterschied zwischen statischem und dynamischem Polymorphismus

Statischer Polymorphismus in Java Bei der klassischen Polymorphie werden die Informationen zum Aufruf einer Methode zur Kompilierzeit gesammelt, während bei der dynamischen Polymorphie die Informationen zum Aufruf einer Methode zur Laufzeit gesammelt werden.

Statischer Polymorphismus
Dynamischer Polymorphismus
Es bezieht sich auf Methodenüberladung. Es bezieht sich auf das Überschreiben von Methoden.
Eventuelle Fehler werden zur Kompilierzeit behoben. Da der Code während der Kompilierung nicht ausgeführt wird, ist der Name statisch.

Ex:

void sum (int a , int b);
void sum (float a, double b);
int sum (int a, int b); //compiler gives error.
Wenn eine Referenzvariable eine überschriebene Methode aufruft, wird die aufzurufende Methode durch das Objekt bestimmt, auf das die Referenzvariable verweist. Dies kann erst zur Laufzeit während der Codeausführung ermittelt werden, weshalb der Name dynamisch ist.

Ex:

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

Super Keyword in Java

Was passiert, wenn die Methode `treatPatient` in der Klasse `Surgeon` die in der Klasse `Doctor` definierte Funktionalität ausführen und anschließend ihr eigenes spezifisches Verhalten zeigen möchte? In diesem Fall ist das Schlüsselwort … super kann verwendet werden, um von der untergeordneten Klasse aus auf Methoden der übergeordneten Klasse zuzugreifen. Die Methode „treatPatient“ in der Klasse „Surgeon“ könnte wie folgt geschrieben werden:

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

Das Schlüsselwort `super` ermöglicht den Zugriff auf beliebige Datenelemente oder Methoden der Oberklasse innerhalb der Unterklasse. Im Folgenden werden wir das Schlüsselwort `super` genauer kennenlernen. Erbeund Polymorphismus in Java mit Beispielprogrammen.

Beispiel: Um Vererbung, Polymorphismus und das Schlüsselwort „super“ zu lernen.

Schritt 1) Kopieren Sie den folgenden Code in einen 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");
      }
}

Schritt 2) Speichern, kompilieren und führen Sie den Code aus. Beobachten Sie die Ausgabe.

Schritt 3) Entfernen Sie die Kommentarzeichen in den Zeilen 6 bis 9. Speichern, kompilieren und führen Sie den Code aus. Beobachten Sie die Ausgabe.

Schritt 4) Zeile 10 auskommentieren. Code speichern und kompilieren.

Schritt 5) Fehler = ? Dies liegt daran, dass die Unterklasse nicht auf private Elemente der Oberklasse zugreifen kann.

Häufig gestellte Fragen

Polymorphismus in Java Die Fähigkeit eines Objekts, viele Formen anzunehmen, ist seine Eigenschaft. Derselbe Methodenname kann unterschiedlichen Code ausführen, je nachdem, auf welches Unterklassenobjekt zur Laufzeit verwiesen wird – dies ist das Kernverhalten der objektorientierten Programmierung.

Java Es unterstützt Kompilierzeit-Polymorphismus durch Methodenüberladung und Laufzeit-Polymorphismus durch Methodenüberschreibung. Die Überladung erfolgt zur Kompilierzeit über statische Bindung, während die Überschreibung zur Laufzeit über dynamische Bindung, die von der JVM verwaltet wird, aufgelöst wird.

Statische Bindung verknüpft einen Methodenaufruf zur Kompilierzeit mit seiner Definition und wird für Methodenüberladung verwendet. Dynamische Bindung verknüpft den Aufruf zur Laufzeit basierend auf dem tatsächlichen Objekttyp und ermöglicht das Überschreiben von Methoden. Java.

Das Schlüsselwort `super` ermöglicht es einer Unterklasse, die überschriebene Methode aufzurufen oder auf ein Datenelement ihrer Oberklasse zuzugreifen. Dadurch kann die Unterklasse die Logik der Oberklasse wiederverwenden und darauf aufbauend spezialisiertes Verhalten implementieren.

KI-Tutoren wie ChatGPT und GitHub Copilot Chat können Polymorphismus erklären in Java Mit Hilfe von benutzerdefinierten Analogien können Übungsaufgaben generiert, Vererbungsbäume durchlaufen und Lernende zu statischer versus dynamischer Bindung befragt werden, um ein schnelleres Erreichen des Lernziels zu ermöglichen.

Ja. KI-gestützte Refactoring-Assistenten wie Cursor, Sourcegraph Cody und IntelliJ AI Assistant können doppelte Bedingungen erkennen, Klassenhierarchien vorschlagen und bestehenden Code umschreiben. Java Code, sodass Methodenüberschreibung wiederholte if-else-Ketten ersetzt.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: