Die Klasse »java.lang.Object« in Java
Die Klasse »java.lang.Object« ist Obertyp jeder Klasse. Jedes Objekt enthält daher alle nicht-statischen Methoden der Klasse »java.lang.Object«.
Im folgenden Stellen wir einige dieser „universellen Methoden“ vor.
Die Methode »getClass()«
Die Methode »getClass()« liefert die Klasse des sie enthaltenden Objekts. Sie wurde bereits vorgestellt.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( java.lang.System.in.getClass() ); }}Protokoll
class java.io.BufferedInputStream
Die Methode »toString()«
Die Methode »toString()« liefert eine Textdarstellung des sie enthaltenden Objekts als ein String-Objekt.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( java.lang.System.in.toString() ); }}Protokoll
java.io.BufferedInputStream@5280d8c8
Die Textdarstellung eines Objektes enthält nicht unbedingt alle Informationen über das Objekt. Sie ist daher nicht unbebingt dafür geeignet, ein Objekt eindeutig zu identifizieren. Vielmehr versucht sie, einige Informationen über das Objekt kurz darzustellen.
Die obige Ausgabe »java.io.BufferedInputStream@5280d8c8« besteht aus dem Klassennamen »java.io.BufferedInputStream«, einem kommerziellen à »@« und einer Art von Objektnamen »5280d8c8«, der aber nicht eindeutig ist (zwei verschiedene Objekte könnten denselben Namen haben, obwohl dies nur selten vorkommt).
Die Methode »equals()«
Die Methode »equals(java.lang.Object)« beurteilt, ob ihr Objekt dem Argumentobjekt gleicht. Sie ergibt einen Wert von Typ »boolean«.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( java.lang.System.in.equals( java.lang.System.in ) ); }}Protokoll
true
Objektparameter
Manche Methoden haben einen Parameter mit dem Typ »java.lang.Object«. Als Argumentwert ist dann jedes Objekt zulässig.
»java.io.PrintStream#println(java.lang.Object)«
Die Methode »java.io.PrintStream#println(java.lang.Object)« hat einen Parameter vom Typ »java.lang.Object«. Daher kann sie mit jedem Objekt als Argumentwert aufgerufen werden. Sie gibt die Textdarstellung des Argumentobjekts aus.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( java.lang.System.in ); }}Protokoll
java.io.BufferedInputStream@5280d8c8
»java.lang.String#valueOf(java.lang.Object)«
Die Methode »java.lang.String#valueOf(java.lang.Object)« hat einen Parameter vom Typ »java.lang.Object«. Daher kann sie mit jedem Objekt als Argument aufgerufen werden. Sie ergibt die Textdarstellung ihres Argumentobjekts.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( java.lang.String.valueOf( java.lang.System.in )); }}Protokoll
java.io.BufferedInputStream@5280d8c8
Die allgemeine und die spezielle Semantik ⃗
Die allgemeine und die spezielle Semantik von »toString()«
Die Dokumentation der Methode »toString()« in der Klasse »java.lang.Objekt« besteht aus zwei Teilen:
Die allgemeine Semantik
Der erste Teil beschreibt Eigenschaften der Methode »toString()«, welche diese Methode in allen Untertypen hat.
- Auszug aus »javase/9/docs/api/java/lang/Object« mit zusätzlichen Hervorhebungen
- In general, the toString method returns a string that "textually represents" this object.
Die spezielle Semantik
Der zweite Teil beschreibt Eigenschaften der Methode »toString()«, die von dieser Dokumentation nur für Objekte der Klasse »java.lang.Objekt« garantiert werden, obwohl dadurch nicht ausgeschlossen ist, daß auch Objekte von Unterklassen diese Eigenschaften haben.
- Auszug aus »javase/9/docs/api/java/lang/Object« mit zusätzlichen Hervorhebungen
- The toString method for class Object returns a string consisting of the name of the class of which the object is an instance, the at-sign character `@', and …
Dieser spezielle Teil der Dokumentation ist daran erkennbar, daß er mit einer Phrase wie “for class Object ” oder “for this class ” eingeleitet wird, die klarstellt, daß dieser Teil der Dokumentation sich nur auf Objekte der dokumentierten Klasse bezieht.
Unterklassen
Die toString-Methoden von Objekten von Unterklassen von »java.lang.Objekt« müssen die allgemeine Semantik von »toString()« erfüllen, aber nicht die spezielle Semantik. Einige Unterklassen erfüllen auch die spezielle Semantik, andere weichen von ihr ab.
Dieses Prinzip, demzufolge Unterklassen die allgemeine Semantik von Methoden einer Klasse erfüllen, aber nicht unbedingt die spezielle, findet man auch bei verschiedenen anderen Klassen und Methoden wieder.
Die allgemeine und die spezielle Semantik von »equals()«
Die allgemeine Semantik
Die Methode »equals(java.lang.Object)« muß Erwartungen erfüllen, die man normalerweise an eine „Gleichheitsmethode“ stellt. Beispielsweise müssen die folgenden Aussagen wahr sein:
- Für jedes Objekt »x« muß der Wert von »x.equals(x)« »true« sein.
- Genau dann, wenn »x.equals(y)« »true« ist, muß auch »y.equals(x)« »true« sein.
Spezielle Semantiken
Der Aufruf »x.equals(y)« für ein Objekt »x« der Klasse »java.lang.Object« ergibt genau dann »true«, wenn »x==y« »true« ergibt.
Für Objekte anderer Klassen sind hier abweichende Definitionen möglich. Beispielsweise könnten zwei verschiedene Objekte als gleich angesehen werden, wenn sie beide in einem gewissen Sinne „gleichwertig“ sind. (Beispiele hierfür folgen später im Kurs.)