Zur Hauptnavigation springen [Alt]+[0] Zum Seiteninhalt springen [Alt]+[1]

Polymorphie

Überschreiben

Was passiert, wenn es namensgleiche Methoden in der Basis- wie in der abgeleiteten Klasse gibt? Zum besseren Verständnis soll eine Analogie helfen:

Entwickler haben bei der Klasse CrtBildschirm100Hz ein neues und besseres Verfahren entwickelt, wie man die Helligkeit des Bildes verändern kann. Nun hat die Klasse ja schon eine Methode setHelligkeit geerbt. Prinzipiell gibt es nun zwei Möglichkeiten für die Entwickler:

  • Man benennt die neue Methode um, - bauen also zwei Knöpfe an den Apparat, mit denen man die Helligkeit beeinflussen kann.

  • Man spendiert ebenfalls einen zweiten Knopf gleichen Namens, versteckt aber den zweiten Knopf (die alte Methode) im Gehäuse. Der neue Knopf führt eine veränderte (überschriebene) Methode der alten Methode aus.

Das erste Verfahren ist nicht besonders sinnvoll. Bleibt das Überschreiben:

Wenn eine Methode überschrieben wurde, so sagt man auch, die Methode ist überlagert. Der Compiler ist in der Lage, zu erkennen, welche der überlagerten Methoden bei einem Aufruf zu verwenden ist, denn selbst beim Überschreiben bleibt die „alte“ Methode aus der Basisklasse vorhanden und wird somit automatisch dann verwendet, wenn das aufrufende Objekt aus der Basisklasse kommt.

Java ist eine polymorphe Programmiersprache. Das bedeutet, dass verschiedene Objekte bei Aufruf derselben Methode eventuell unterschiedliches durchführen. Ein Beispiel aus unserer Bildschirm-Klasse soll dies verdeutlichen:

In der Bildschirm-Klasse:


  public void setHelligkeit(int helligkeit) {
   this.helligkeit = helligkeit;
  }

In der abgeleiteten Klasse Crt-Bildschirm:


  public void setHelligkeit(int helligkeit) {
   super.setHelligkeit(helligkeit) ;
   this.kontrast = this.kontrast - 1;
  }

In der abgeleiteten Klasse Ambilight-Bildschirm:


  public void setHelligkeit(int helligkeit) {
   super.setHelligkeit(helligkeit) ;
   this.umgebungslicht = this.helligkeit / 4 + this.kontrast /2;
  }

Durch die Verwendung von super(...) wird klar, dass die abgeleiteten Klassen zwar die namensgleiche Methode aus der Oberklasse verwenden, die Zusatzzeilen zeigen aber auch, dass die Methoden nun alle verschieden sind. Die Methode wurde überschrieben.

Hier nun ein Aufruf aus der Fernseh-Klasse:


  public void helligkeitErhoehen() {
   bildschirm.setHelligkeit(bildschirm.getHelligkeit()+1);
  }

Und genau hier sehen wir die Polymorphie: Das Objekt bildschirm gehört zu einer bestimmten Klasse. Der Aufruf bildschirm.setHelligkeit ruft die zum Objekt passende Methode auf.

Überladen

Überladen heißt eine Methode hingegen, wenn es eine namensgleiche Methode in der Klasse gibt, die aber andere Parameter entgegennimmt. So könnte man zum Beispiel die Methode int addieren( int a, int b) durch 3DVektor addieren(3DVektor a, 3DVektor b) überladen werden. Da es sich bei diesem Vorgang ja ebenfalls um eine Art der Polymorphie handelt, wird sie, im Gegensatz zum obigen Sachverhalt, parametrische Polymorphie genannt.

Sonstige Referenz-Typen

Objekte – eigene oder vorgefertigte, wie String- oder Array-Objekte sind datentechnisch sogenannte Referenz-Typen. Das bedeutet, dass ein neues Objekt bezüglich seiner Adresse (Referenz) im Heap gespeichert wird. Das hat weitreichende Konsequenzen im Umgang mit Objekten. Genaueres dazu kann man im Dokument Lebenszyklus von Objekten nachlesen. Hier soll nur der Unterschied der String- und Array-Objekte zu den oben behandelten allgemeinen Objekten herausgestellt werden.

  • Bei Strings und bei Arrays kennt der Compiler Konstanten, die den Aufruf new bei der Erzeugung überflüssig machen:
    String satz = “Alles klar!“
    erzeugt beispielsweise den neuen String satz. Entsprechend:
    int[] vektor = {9,8,7,6}
  • Arrays sind Objekte „ohne Klasse“. Sie werden vom Compiler erzeugt, haben aber keine explizite Klassendefinition. Trotzdem gibt es Attribute, wie length etc.

 

 

Einführung: Herunterladen [odt][330 KB]

 

Weiter zu Lebenszyklus von Objekten