29.6 Die überschriebene Methode toString() - Polymorphie
 
neue Ausgabe

Download
StoppUhrDemo4. java

wir benutzen

StoppUhr.java

In diesem Kapitel wollen wir unsere Fachklasse StoppUhr um eine Methode erweitern und dabei Einiges über Polymorphie lernen.

public class StoppUhrDemo4 {

  public static void main (String[] args) {
     StoppUhr meineStoppUhr = new StoppUhr();
     try{
       meineStoppUhr.starten();
       Thread.sleep(5000);
       meineStoppUhr.stoppen();
     }
     catch (InterruptedException exp){
       //nichts
    
}
     System.out.println(meineStoppUhr);
  }
}

Dieses Programm unterscheidet sich von den bisherigen Demo-Programmen in der Ausgabe. In System.out.println(..) wird das Objekt meineStoppUhr übergeben, und das Programm funktioniert, allerdings liefert es eine Ausgabe, mit der wir nicht gerechnet haben.

Ausgegeben wird der Name der Klasse, deren Instanz meineStoppUhr ist, gefolgt von dem '@'-Zeichen und einem so genannten Hashcode in Hexadezimaldarstellung. Was ist hier geschehen?

Verstehen können wir dies erst, wenn wir wissen, dass jede Klasse, also auch die selbst geschriebene Klasse StoppUhr von der 'Klasse aller Klassen' von der Klasse Object abgeleitet wird.  Damit erbt unsere Klasse auch alle in der Klasse Object angelegten Methoden, wie z.B. die Methode toString(). Weiter müssen wir wissen, dass die Methode println(..) grundsätzlich für das übergebene Objekt dessen toString()-Methode aufruft. Das letztere bedeutet, die Anweisung

System.out.println(meineStoppUhr);

heißt ausführlich geschrieben

System.out.println(meineStoppUhr.toString());

Um zu die oben dargestellte Ausgabe nun zu verstehen, muss man also die Methode toString() aus der Klasse Object kennen, denn von dort hat die Klasse StoppUhr diese Methode geerbt . Ein Blick in die Java-Dokumentation zeigt uns, wie toString() in Object implementiert ist, nämlich

getClass().getName()+"@"+Integer.toHexString(haschCode())

Zunächst wird die Klasse ermittelt, deren Instanz meineStoppUhr ist (getClass()), danach wird deren Namen bestimmt (getName()) und als Zeichenkette geliefert. Dieser Zeichenkette wird das '@'-Zeichen als einelementige Zeichenkette hinzugefügt. Schließlich wird noch eine letzte Zeichenkette angehängt: Ein sog. Hashcode, der als int-Wert vorliegt, in Hexadezimaldarstellung umgeformt, und schließlich als String übergeben wird.

Anmerkung: Neben toString() erben alle Klassen von Object auch die Methode equals(), weshalb diese nicht mehr implementiert werden muss.
 

wir überschreiben toString()

Downloads:
StoppUhr.java


 
Wir können uns dafür entscheiden, diese von Object geerbte Methode in unserer Klasse StoppUhr zu überschreiben und ihr dadurch eine eigene, für unsere Klasse angepasste Funktionalität geben. Dazu ergänzen wir unsere Klasse StoppUhr um
public String toString(){
  double zeit = getLaufzeit()/1000.0;
  return Double.toString(zeit) + " Sekunden";
}

Interessant ist, dass wir für die eigene toString()-Methode die Klassenmethode toString() aus der Klasse Double benutzt haben. Die Klasse Double, die ja auch von Object abgeleitet ist und von ihr toString() geerbt hat, hat toString() auch schon überschrieben, wie man durch einen Blick in die Java-Dokumentation leicht nachprüfen kann.

Dass ein Aufruf einer Methode toString() kontextabhängig ist, ihre Funktionalität also von der Klasse abhängt, in der Sie implementiert ist, ist eine Form der Polymorphie. (polymorph = vielgestaltig)

Ohne StoppUhrDemo4 zu verändern, liefert das Testprogramm nun die gewünschte Ausgabe:

 

UML Die fertige Fachklasse StoppUhr hat in der UML-Notation jetzt die nebenstehende Gestalt.

 

 

zu 29.7 Eine GUI für die Fachklasse StoppUhr
zur Startseite www.pohlig.de  (C) MPohlig 2006