Benutzer-Werkzeuge

Webseiten-Werkzeuge


klassen2:polymorphismus:start

Dies ist eine alte Version des Dokuments!


Überschreiben von Methoden, Polymorphismus

Im folgenden Beispiel sind die Klassen Rechteck und Kreis Unterklassen der Klasse Figur. Letztere besitzt ein Attribut Farbe und eine Methode schreibeDaten() mit der grundlegenden Funktionalität, diese Farbe auszugeben. Es ist nicht sinnvoll, Objekte der Klasse Figur zu instanzieren, daher haben wir die Klasse als abstract deklariert.

abstract class Figur {
 
   String farbe;
 
   public Figur(String farbe) {
      this.farbe = farbe;
   }
 
   public void schreibeDaten() {
      println("Farbe: " + farbe); 
   }
 
}

Die Klasse Rechteck ist eine Unterklasse der Klasse Figur und besitzt über das Attribut Farbe hinaus noch die Attribute Breite und Länge. Die Methode schreibeDaten() der Klasse Figur ist für Rechteck-Objekte nicht mehr hinreichend, da bei diesen Objekten auch die Länge und die Breite ausgegeben werden soll.

Überschreiben von Methoden

Wir schreiben in die Klasse Rechteck daher eine weitere Methode schreibeDaten() mit derselben Signatur (d.h. demselben Bezeichner, denselben Parametertypen und demselben Rückgabedatentyp) wie die Methode der Oberklasse Figur. Man sagt: "Wir überschreiben die Methode schreibeDaten() der Klasse Figur in der Klasse Rechteck."
Natürlich soll auch bei Rechtecken neben der Länge und der Breite noch deren Farbe ausgegeben werden. Wir wollen daher in der Methode schreibeDaten() der Klasse Rechteck die gleichnamige Methode der Oberklasse Figur aufrufen. Dazu benutzen wir - wie auch schon bei Konstruktoren - das Schlüsselwort super.

Wir erinnern uns:
Innerhalb des Konstruktors einer Unterklasse ist der Aufruf des Konstruktors der Oberklasse mittels super verpflichtend. Diese Pflicht besteht bei anderen überschriebenen Methoden nicht.

  1. class Rechteck extends Figur {
  2.  
  3. double breite;
  4. double höhe;
  5.  
  6. public Rechteck(String farbe, double breite, double höhe) {
  7. super(farbe);
  8. this.breite = breite;
  9. this.höhe = höhe;
  10. }
  11.  
  12. public void schreibeDaten() {
  13. super.schreibeDaten(); // Aufruf der gleichnamigen Methode der Oberklasse
  14. println("Breite: " + breite, Color.lightblue);
  15. println("Höhe: " + höhe, Color.lightblue);
  16. }
  17. }

Wird nun bei einem Rechteck-Objekt die Methode schreibeDaten() aufgerufen, so kommt immer die Methode der Klasse Rechteck zum Zug, nicht die Methode der Oberklasse Figur.

klassen2/polymorphismus/start.1588241951.txt.gz · Zuletzt geändert: 2021/12/29 11:29 (Externe Bearbeitung)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki