Guido Krüger - JAVA 1.1 lernen - Kapitel 4
Referenztypen
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.
Hinweis |
Das Verständnis für Referenztypen ist entscheidend für die Programmierung in Java. Referenztypen können prinzipiell genauso benutzt werden wir 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 (s. 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 (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.
Speichermanagement
Während primitive Typen lediglich deklariert werden, reicht dies bei Referenztypen nicht aus. Diese müssen mit Hilfe des new-Operators oder - im Falle von Arrays und Strings - durch Zuweisung von Literalen zusätzlich noch explizit erzeugt werden. Beispiel:
Vector v = new Vector();
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 ständig nach Objekten, die nicht mehr referenziert werden, um den durch sie belegten Speicher freizugeben.
(C) 1997 Guido Krueger, "Java 1.1 lernen", Addison-Wesley, Bonn, 1997