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.