6. Referenzen, strukturierte Datentypen

Objektvariablen enthalten Referenzen auf Objekte. Sie unterscheiden sich von Variablen primitiver Datentypen in einer Reihe von Eigenschaften:

  Variablen primitiver Datentypen Objektvariablen
Initialisierung Standardwert des Typs; direkt benutzbar Null Zeiger, Objekt muss separat erzeugt werden
Exklusivität Variable gehört exklusiv zum Objekt referenziertes Objekt gehört nicht exklusiv zum umgebenden Objekt
Lebensdauer die des umgebenden Objekts referenziertes Objekt existiert so lange es von irgendeiner Referenz referenziert wird
Ausnahmebehandlung nicht relevant Der Versuch eine Methode oder Objektvariable mit einer Referenz auf null zu benutzen führt zu einer Ausnahme
Parameterübergabe bei Methoden Kopie wird angelegt Objekt wird nicht kopiert. Nur Referenz wird kopiert

 

Neue Objekte werden im Adressraum nur mit dem new() Operator angelegt. Referenzen speichern nur die eindeutige Identität unter der das Objekt zu erreichen ist.

Die in der Referenz verwaltete eindeutige Objektidentität bleibt für die gesamte Lebensdauer des Objekts konstant. Sie ist eine logische Kennung. Das unten aufgeführte Programmbeispiel mit Diagramm ist jedoch nur als Gedankenmodell zu verstehen. Die konkrete Implementierung in einer virtuellen Java Maschine kann durchaus anders aussehen. Sie ist für den Javaentwickler transparent.

Kraftwagen wagen1 = new Kraftwagen ("0-1");
Kraftwagen wagen2 = wagen1;
Kraftwagen wagen3 = new Kraftwagen("0-2");

Das Referenzkonzept von Java ist die einzige Möglichkeit auf Objekte zuzugreifen.

Das Referenzenkonzept von Java ist syntaktisch sehr ähnlich zu dem Pointerkonzept von C und C++. Es gibt jedoch wichtige Unterschiede mit signifikanten Auswirkungen auf die Stabilität der Anwendungen:

  Java C/C++
Begriff Referenz (Reference) Zeiger (Pointer)
Implementierung abstrakter Datentyp (Klasse) Speicherbereich
direkter Speicherzugriff nein ja
Typcheck zum Übersetzungszeitpunkt ja ja (Normalerweise)
Zugriffskontrolle auf eine nicht initialisierte Referenz Check mit eventuellem Wurf einer behandelbaren Ausnahme kein Check auf Existenz oder Gültigkeit des Objekts

 

Bemerkung: Der neue C++11 Standard bietet viele Verbesserungen dieser historisch bedingten Defizite von C/C++. Da C++ oft für Anwendungen deren Leistung sehr wichtig ist (Systemprogrammierung) benutzt wird, sind alle zusätzlichen Checks von C++11 immer nur optional.