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:
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.
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:
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");
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;
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
Erzeugt man eine neue Figur und speichert diese als f2
,
dann zeigen f1
und f2
auf unterschiedliche Objekte:
f2 = new Figur(1, 1, "rot");
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:
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.