Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 3. Auflage
<< | < | > | >> | API | Kapitel 4 - Datentypen

## 4.5 Referenztypen

- 4.5 Referenztypen
  - 4.5.1 Beschreibung
  - 4.5.2 Speichermanagement

### 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: |  |
Hinweis

- 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 Abschnitt 8.1.2).
- 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 Abschnitt 8.1.2 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.

### 4.5.2 Speichermanagement

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.

    Vector v = new Vector();

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.

Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 3. Auflage, Addison Wesley, Version 3.0
<< | < | > | >> | API | © 1998-2002 Guido Krüger, http://www.javabuch.de