Die Mutter aller Klassen
Alle Klassen in Java sind letztlich Unterklassen der Klasse Object, die daher
auch als die Mutter aller Klassen bezeichnet wird. Sie vererbt ihren
Unterklassen unter anderem die Methoden boolean equals(object: Object),
int hashCode() und String toString(). Diese drei Methoden sollte jede eigene
Klasse sinnvoll überschreiben.
Die Methode boolean equals(object: Object)
Die Methode boolean equals(object: Object) prüft zwei Objekte auf inhaltliche
Gleichheit. Zwei Objekte gelten in der Regel als gleich, wenn alle ihre
Attribute übereinstimmen.
public class Computer {
...
@Override
public boolean equals(Object object) {
if (this == object) {
return true;
}
if (object == null) {
return false;
}
if (getClass() != object.getClass()) {
return false;
}
Computer other = (Computer) object;
return Objects.equals(description, other.description) && Objects.equals(cpu, other.cpu)
&& memoryInGb == other.memoryInGb;
}
...
}
Die Methode int hashCode()
Die Methode int hashCode() liefert den Hashcode des aktuellen Objekts zurück.
Sie sollte so überschrieben werden, dass inhaltlich gleiche Objekte denselben
Hashwert liefern. Das ist insbesondere beim Arbeiten mit Hash-basierten
Datensammlungen wie HashMap<K, V> notwendig.
public class Computer {
...
@Override
public int hashCode() {
return Objects.hash(description, cpu, memoryInGb);
}
...
}
Die statische Methode int hash(values: Object...) der Klasse Objects bietet
eine einfache Möglichkeit zur Implementierung von hashCode().
equals() und hashCode() müssen immer gemeinsam überschrieben werden. Gilt
für zwei Objekte a.equals(b) == true, muss auch a.hashCode() == b.hashCode()
gelten. Andernfalls verhalten sich hash-basierte Datenstrukturen wie HashMap
und HashSet falsch (siehe Schlüsseltransformationen).
Die Methode String toString()
Die Methode String toString() liefert eine eindeutige Kennung des Objekts in
der Form [vollständiger Klassenname]@[Adresse im Hauptspeicher in
hexadezimaler Notation] zurück. Üblicherweise wird sie so überschrieben, dass
alle relevanten Attribute als Zeichenkette zurückgegeben werden — typischerweise
in der Form [Klassenname][Attribut]=[Wert], ...].
public class Computer {
...
@Override
public String toString() {
return "Computer [description=" + description + ", cpu=" + cpu + ", memoryInGb=" + memoryInGb
+ "]";
}
...
}
Wird den print-Methoden des Ausgabestroms System.out eine Objektreferenz
übergeben, wird implizit die Methode String toString() des jeweiligen Objektes
aufgerufen.