Zum Hauptinhalt springen

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.

Computer.java (Auszug)
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.

Computer.java (Auszug)
public class Computer {
...
@Override
public int hashCode() {
return Objects.hash(description, cpu, memoryInGb);
}
...
}

info

Die statische Methode int hash(values: Object...) der Klasse Objects bietet eine einfache Möglichkeit zur Implementierung von hashCode().

warnung

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], ...].

Computer.java
public class Computer {
...
@Override
public String toString() {
return "Computer [description=" + description + ", cpu=" + cpu + ", memoryInGb=" + memoryInGb
+ "]";
}
...
}
info

Wird den print-Methoden des Ausgabestroms System.out eine Objektreferenz übergeben, wird implizit die Methode String toString() des jeweiligen Objektes aufgerufen.