Fachkonzept - Referenzen
Referenzen und Referenzvariablen
Objekte werden über Referenzen verwaltet. Eine Referenz ist ein Verweis auf ein Objekt. Um ein Objekt festzuhalten, braucht man eine Variable, die diese Referenz speichert – eine Referenzvariable.
Solche Situationen stellt man in einem Objektdiagramm
dar. Ein Objekt wird als Kasten gezeichnet: Ganz oben steht – unterstrichen – die
Klasse mit vorangestelltem Doppelpunkt (:Figur), darunter stehen die
aktuellen Werte der Attribute. Ein Pfeil von einer Variablen zum Kasten zeigt,
dass die Variable auf dieses Objekt verweist.
Hier verweist die Variable f1 auf ein Objekt der Klasse
Figur.
Objekte haben keine Namen
Es ist wichtig, genau zu unterscheiden: f1 ist der Name einer
Variablen, nicht der Name des Objekts. Das Objekt selbst hat keinen
Namen. Man erreicht es ausschließlich über eine Referenz.
Objekte haben keine Namen, sondern nur die Referenzen auf sie.
In Objektdiagrammen wird oft eine vereinfachte Schreibweise benutzt, bei der der Variablenname direkt an den Objektkasten geschrieben wird. Auch hier gilt aber: Der Name gehört zur Variablen, nicht zum Objekt.
Zuweisungen bei Referenzvariablen
Mit dem Begriff der Referenz lässt sich erklären, was eine Zuweisung zwischen Referenzvariablen bewirkt. Wir gehen von einer Figur aus:
val f1 = Figur("blau", 0, 0)
var f2 = f1
Die Zuweisung f2 = f1 erzeugt kein neues Objekt. Sie führt
nur einen weiteren Namen f2 für dasselbe Objekt ein. Beide Variablen
verweisen auf dasselbe Objekt:
Verändert man nun den Zustand des Objekts über die eine Variable, so ist die Änderung auch über die andere sichtbar – es ist ja dasselbe Objekt:
f1.gehe(3) // bewegt das Objekt nach links
println(f2.x) // die Änderung ist auch über f2 sichtbar
Mit dem Operator === kann man prüfen, ob zwei Variablen auf dasselbe
Objekt verweisen. Erzeugt man dagegen ein neues Objekt und weist es zu, so
verweisen die Variablen anschließend auf verschiedene Objekte:
f2 = Figur("rot", 4, 4) // f2 verweist jetzt auf ein neues, eigenes Objekt
println(f1 === f2) // false
Referenzen auf "nichts": null
Eine Referenzvariable kann auch auf gar kein Objekt verweisen. Dieser Fall wird
durch den Wert null ausgedrückt. Im Objektdiagramm verweist die
Variable dann auf nichts:
In Kotlin muss man bereits beim Datentyp festlegen, ob eine Variable
null enthalten darf. Nur ein nullbarer Typ wie Figur?
erlaubt den Wert null; ein Typ ohne Fragezeichen (Figur)
enthält immer ein echtes Objekt.
var aktuellerSpieler: Figur? = null // erlaubt: darf null sein
Ruft man eine Methode an einem Wert auf, der null sein könnte, lehnt
der Compiler das ab, bis man den Fall null behandelt hat. Dadurch
verhindert Kotlin schon beim Schreiben des Programms den häufigen Fehler, eine
Nachricht an „niemand" zu schicken. (In Sprachen ohne diese Absicherung – etwa
Java – stürzt das Programm an dieser Stelle zur Laufzeit ab.)
Referenzen "spielen"
Eine Referenz kann man sich wie einen ausgestreckten Arm vorstellen, der auf ein
Objekt zeigt. Der Arm ist die Referenz; eine Beschriftung am Arm entspricht dem
Namen der Referenzvariablen. Ein Arm kann auch auf niemanden zeigen
(null). Um Methoden oder Attribute zu nutzen, muss der Arm aber auf
ein konkretes Objekt zeigen.
Eine Referenz verweist auf ein Objekt; verweist
sie auf keines, hat sie den Wert null. Gespeichert wird sie in
einer Referenzvariablen. Eine Zuweisung zwischen
Referenzvariablen kopiert kein Objekt, sondern lässt eine weitere Variable
auf dasselbe Objekt verweisen. Objekte selbst haben keine Namen – nur die
Referenzen auf sie.