Logo des digitalen Schulbuchs inf-schule.de. Schriftzug in Zustandsübergangsdiagramm eines endlichen Automaten.

Fachkonzept - Referenzen

Referenzen

Objekte werden mit Hilfe von Referenzen verwaltet. Um ein Objekt zu speichern benötigt man eine Variable, die auf das Objekt verweist. Man spricht deshalb auch von einer Referenzvariablen.

Im Objektdiagramm lässt sich eine solche Referenzsituation wie folgt darstellen:

Referenz

Hier verwaltet die Variable f1 ein Objekt der Klasse Figur mit Hilfe einer Referenz.

In Objektdiagrammen benutzt man auch oft eine vereinfachte Darstellung der beschriebenen Referenzsituationen. Streng genommen haben aber Objekte keine Namen, sondern nur die Referenzen darauf.

Referenz

Zuweisungen bei Referenzvariablen

Mit Hilfe von Referenzen lässt sich jetzt auch die Auswertung von Zuweisungen bei Referenzvariablen erklären. Das folgende Ablaufprotokoll verdeutlicht zunächst diese Auswertung anhand konkreter Beispiele.

Die Wirkung von

Figur f1;

lässt sich darstellen durch:

Objektdiagramm

Es wurde eine neue Variable definiert, die auf Objekte der Klasse Figur zeigen kann. Momentan zeigt die Variable noch auf kein Objekt, was in Java durch den Wert null dargestellt wird.

Danach könnte z.B. ein neues Objekt erzeugt und zugewiesen werden durch:

f1 = new Figur(1, 2, "blau");
Objektdiagramm

Mit der Zuweisung f1 = new Figur(...) wird ein neues Objekt der Klasse Figur erzeugt. Mit der Variablen f1 wird eine Referenz auf dieses Objekt verwaltet.

Die Definition der Variablen sowie die Erzeugung und Zuweisung eines neuen Objekts werden oft in einer Zeile notiert:

Figur f1 = new Figur(1, 2, "blau");

Anschließend soll z.B. folgender Code ausgeführt werden:

Figur f2 = f1;
Objektdiagramm

Die Zuweisung f2 = f1 führt nur einen neuen Namen f2 für das von f1 verwaltete Objekt ein. Beide Variablen verwalten also Referenzen auf dasselbe Objekt.

Wenn man den Zustand des von f1 verwalteten Objekts verändert (z. B. durch den Methodenaufruf f1.gehe(3)), so ändert sich natürlich auch das von f2 verwaltete Objekt, da beide ja identisch sind:

f1.gehe(3); // Gehe in Richtung 3, also nach links
Objektdiagramm

Erzeugt man eine neue Figur und speichert diese als f2, dann zeigen f1 und f2 auf unterschiedliche Objekte:

f2 = new Figur(1, 1, "rot");
Objektdiagramm

Mit der Zuweisung f2 = new Figur(...) wird ein neues Objekt der Klasse Figur erzeugt und mit dem Namen f2 verwaltet. Es existieren jetzt zwei verschiedene Objekte der Klasse Figur, die von den beiden Variablen f1 und f2 verwaltet werden.

Weist man durch

f1 = f2;

das von f2 referenzierte Objekt nun auch f1 zu, ergibt sich folgende Situation:

Objektdiagramm

Auf die blaue Figur existiert nun keine Referenz mehr, man kann auf das Objekt also nicht mehr zugreifen. Der Garbage Collector ("Müllsammler") von Java erkennt das und entfernt das Objekt dann aus dem Speicher. Allerdings lässt sich nicht genau sagen, wann er das macht, da der Garbage Collector z.B. nicht aktiv wird, wenn andere Prozesse den Computer schon auslasten.

Nachricht an "niemand"

Ein typischer Fehler beim Programmieren tritt auf, wenn man eine Referenzvariable hat, die auf kein Objekt verweist. Der Wert der Variablen ist also null. Möchte man dann auf ein Attribut oder eine Methode eines Objektes zugreifen, das es nicht gibt, erhält man eine NullPointerException und das Programm bricht mit einem Fehler ab.

Eine Situation, in der so etwas auftritt, ist bspw. folgende:

// Variable f3 wird definiert
Figur f3;
// Nachricht (Methodenaufruf) "gehe" an f3
f3.gehe(0); // Programm bricht mit "NullPointerException" ab.

Referenzen "spielen"

Du kannst Dir Referenzen wie den Arm eines Menschen vorstellen, der auf ein anderes Objekt zeigt. Der Arm ist die Referenz. Erhält der Arm eine Beschriftung, dann entspricht dies dem Namen der Referenzvariablen. Ein Arm kann auch auf niemanden zeigen. Möchte man aber Methoden oder Attribute eines Objektes nutzen, so muss auf ein konkretes Objekt gezeigt werden. Die Referenzvariable / der Arm existiert aber auch, wenn auf "nichts" (in Java null) gezeigt wird.

Komplexere Vorgänge kannst Du Dir oft als Rollenspiel in dieser Art verbildlichen.

Zusammenfassung

Eine Referenz kann auf ein konkretes Objekt verweisen oder zeigen. Zeigt sie auf kein Objekt hat sie in Java den Wert null. Um eine Referenz zu speichern benötigt man eine Referenzvariable. Der Datentyp der Referenzvariablen entspricht dem Datentyp des Objekts (oder einer Oberklasse). Wenn auf ein Objekt nicht mehr referenziert wird, entfernt in Java der Garbage Collector dieses aus dem Speicher. Objekte haben keine Namen, sondern nur die Referenzen auf Objekte.

X

Fehler melden

X

Suche