Mehrere Figuren und Referenzen
Zwei Figuren erzeugen
Für ein Spiel brauchen wir zwei Figuren. Wir erzeugen sie und merken sie uns in
zwei Variablen f1 und f2:
val f1 = Figur("blau", 0, 0)
val f2 = Figur("rot", 4, 4)
Solche Situationen kann man mit einem Objektdiagramm
darstellen. Jedes Objekt wird als Kasten gezeichnet: oben steht unterstrichen die
Klasse (:Figur), darunter die aktuellen Werte der Attribute.
Ein Pfeil von einer Variablen zum Kasten bedeutet: „Diese Variable verweist auf
dieses Objekt."
Objekte haben keine Namen
Wichtig ist die Sprechweise: f1 und f2 sind nicht
die Namen der Objekte. Es sind die Namen von Variablen,
die auf die Objekte verweisen. Ein solcher Verweis heißt
Referenz.
Das Objekt selbst trägt keinen Namen – man erreicht es nur über eine Referenz.
Das wird deutlich, wenn man einer zweiten Variablen dasselbe Objekt zuweist. Im Spiel müssen wir uns z.B. merken, welche Figuren gerade „an der Reihe" sind. Wenn der Münzwurf die rote Figur bestimmt, schreiben wir:
val aktuelleFigur1 = f2
Dabei wird kein neues Objekt erzeugt. Die Zuweisung führt nur einen
weiteren Namen für dasselbe Objekt ein: aktuelleFigur1 und
f2 verweisen jetzt auf dieselbe Figur.
Objekte haben keine Namen, sondern nur die Referenzen
auf sie.
Eine Zuweisung wie aktuelleFigur1 = f2 kopiert kein Objekt,
sondern lässt eine weitere Variable auf dasselbe Objekt verweisen.
Aufgabe 1 - Dasselbe Objekt
Sage voraus, was das folgende Programm ausgibt. Beachte, dass
aktuelleFigur1 auf dasselbe Objekt wie f2 verweist.
Mit dem Operator === kannst du prüfen, ob zwei Variablen auf
dasselbe Objekt verweisen. Führe das Programm danach aus.
class Figur(val farbe: String, var x: Int, var y: Int) {
fun gehe(richtung: Int) {
when (richtung) {
0 -> y = y - 1
1 -> x = x + 1
2 -> y = y + 1
3 -> x = x - 1
}
if (x < 0) x = 4
if (x > 4) x = 0
if (y < 0) y = 4
if (y > 4) y = 0
}
}
fun main() {
val f1 = Figur("blau", 0, 0)
val f2 = Figur("rot", 4, 4)
val aktuelleFigur1 = f2 // dasselbe Objekt wie f2
aktuelleFigur1.gehe(3) // eine Bewegung nach links
println(f2.x) // ?
println(aktuelleFigur1.x) // ?
println(f2 === aktuelleFigur1) // ?
println(f1 === f2) // ?
}
Aufgabe 2 - Objektdiagramm zeichnen
Zeichne das Objektdiagramm, das sich am Ende des Programms aus Aufgabe 1 ergibt. Achte darauf, wie viele Objekte es gibt und welche Variablen auf welches Objekt verweisen.