Skip to main content

Equals und toString

Die Klasse Object definiert wichtige Methoden, die für jedes Objekt in Java zur Verfügung stehen sollten. Die zwei wichtigsten für diesen Kurs sind equals und toString.

Die toString Methode

Die Methode toString gibt uns die Möglichkeit, eine Textrepräsentation für ein Objekt zu definieren. Die Methode toString wird zum Beispiel immer dann aufgerufen, wenn wir ein Objekt mittels System.out.println ausgeben. Wenn wir

System.out.println(obj);

schreiben, wird also intern eigentlich

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

ausgeführt.

Die Klasse Object stellt bereits eine Implementation der Klasse toString zur Verfügung. Da Object aber nichts über die von uns implementierten Datentypen weiss, ist diese Implementation sehr allgemein. Es wird nur der Name der Klasse sowie eine interne Referenz ausgegeben. Probieren Sie dies doch gleich aus:

Um eine sinnvolle Ausgabe zu erhalten, müssen wir die Methode toString auf der Klasse Point implementieren. Da die Klasse Object uns bereits eine Implementation zur Verfügung stellt, die wir überschreiben werden, müssen wir dies mit dem speziellen Schlüsselwort @Override kennzeichnen. Die verbesserte Implementation sieht wie folgt aus.

class Point {
double x;
double y;

Point(double x, double y) {
this.x = x;
this.y = y;
}

@Override
public String toString() {
return "(" +x + "," +y + ")";
}
}

Probieren Sie diese Änderung doch direkt aus. Wie sieht die neue Ausgabe aus?

Die equals Methode

Analog dazu können wir auch die Methode equals neu definieren. Die equals Methode hat die Signatur:

public boolean equals(Object obj) ;

Das heisst, wir wollen das this-Objekt mit dem übergebenen Objekt obj vergleichen. Um ein Objekt auf Gleichheit zu prüfen, müssen wir erst feststellen, ob es sich um ein Objekt von demselben Typ handelt. Falls ja, dieses in den Zieltyp casten. Danach können wir die Felder vergleichen. Für unsere Point Klasse, könnte die Implementation wie folgt aussehen:

class Point {
double x;
double y;

Point(double x, double y) {
this.x = x;
this.y = y;
}

@Override
public boolean equals(Object obj) {

if (!(obj instanceof Point))
return false;
else {
Point other = (Point) obj;
return this.x == other.x && this.y == other.y;
}
}
}

Experimente

  • Was passiert, wenn Sie zwei Punkte (mit denselben Koordinaten) vergleichen, ohne, dass die equals Methode überschrieben wurde?

Haben Sie Fragen oder Bemerkungen? Schreiben Sie diese doch ins Forum.