4.5.1 Beschreibung
Referenztypen sind neben den primitiven Datentypen die zweite wichtige
Klasse von Datentypen in Java. Zu den Referenztypen gehören Objekte,
Strings und Arrays. Weiterhin gibt es die vordefinierte Konstante
null,
die eine leere Referenz bezeichnet.
Eigentlich sind auch Strings und Arrays Objekte, aber es gibt bei
ihnen einige Besonderheiten, die eine Unterscheidung von normalen
Objekten rechtfertigen:
- Sowohl bei Strings als auch bei Arrays kennt der Compiler Literale,
die einen expliziten Aufruf des new-Operators
überflüssig machen.
- Arrays sind »klassenlose« Objekte. Sie können
ausschließlich vom Compiler erzeugt werden, besitzen aber keine
explizite Klassendefinition. Dennoch haben sie eine öffentliche
Instanzvariable length
und werden vom Laufzeitsystem wie normale Objekte behandelt.
- Die Klasse String
ist zwar wie eine gewöhnliche Klasse in der Laufzeitbibliothek
von Java vorhanden. Der Compiler hat aber Kenntnisse über den
inneren Aufbau von Strings und generiert bei Stringoperationen Code,
der auf Methoden der Klassen String
und StringBuffer
zugreift. Eine ähnlich enge Zusammenarbeit zwischen Compiler
und Laufzeitbibliothek gibt es auch bei Threads und Exceptions. Wir
werden auf diese Besonderheiten in den nachfolgenden Kapiteln noch
einmal zurückkommen.
Das Verständnis für Referenztypen ist entscheidend für
die Programmierung in Java. Referenztypen können prinzipiell
genauso benutzt werden wie primitive Typen. Da sie jedoch lediglich
einen Verweis darstellen, ist die Semantik einiger Operatoren anders
als bei primitiven Typen: |
 |
|
 |
- Die Zuweisung einer Referenz kopiert lediglich den Verweis auf
das betreffende Objekt, das Objekt selbst dagegen bleibt unkopiert.
Nach einer Zuweisung zweier Referenztypen zeigen diese also auf ein
und dasselbe Objekt. Sollen Referenztypen kopiert werden, so ist ein
Aufruf der Methode clone
erforderlich (siehe Kapitel 7).
- Der Gleichheitstest zweier Referenzen testet, ob beide Verweise
gleich sind, d.h. auf ein und dasselbe Objekt zeigen. Das ist aber
eine strengere Forderung als inhaltliche Gleichheit. Soll lediglich
auf inhaltliche Gleichheit getestet werden, kann dazu die equals-Methode
verwendet werden, die von den meisten Klassen implementiert wird (ebenfalls
in Kapitel 7 erläutert).
Analoges gilt für den Test auf Ungleichheit.
Anders als in C und C++, wo der *-Operator
zur Dereferenzierung eines Zeigers nötig ist, erfolgt in Java
der Zugriff auf Referenztypen in der gleichen Weise wie der auf primitive
Typen. Einen expliziten Dereferenzierungsoperator gibt es dagegen
nicht.
Während primitive Typen lediglich deklariert werden, reicht dies
bei Referenztypen nicht aus. Sie müssen mit Hilfe des new-Operators
oder - im Falle von Arrays und Strings - durch Zuweisung von Literalen
zusätzlich noch explizit erzeugt werden.
Listing 4.11: Erzeugen eines Objekts mit dem new-Operator
|
 |
|
 |
Java verfügt über ein automatisches Speichermanagement.
Dadurch braucht man sich als Java-Programmierer nicht um die Rückgabe
von Speicher zu kümmern, der von Referenzvariablen belegt wird.
Ein mit niedriger Priorität im Hintergrund arbeitender Garbage
Collector sucht periodisch nach Objekten,
die nicht mehr referenziert werden, um den durch sie belegten Speicher
freizugeben.