b.x
bezeichnet in dem Fall die in Klasse B deklarierte Instanzvariable x.
((A) b)
weist den Compiler an, das b wie ein A zu behandeln. Dort ist x eine Klassenvariable. D. h.
((A) b).x
ist im Ergebnis
A.x
.
Unmittebar vor dem Aufruf
new B(3);
gilt A.x == 3, A.y == 4. Die drei Zeilen im Konstruktor von B machen nun folgendes:
- Zunächst wird der "int"-Konstruktor von A aufgerufen, dort wird A.x um 1 erhöht. Es gilt nun also A.x == 4
this.x
bezieht sich auf die Instanzvariable x von B, diese wurde mit 1 initialisiert und um den via Parameter x angegebenen Wert von 3 erhöht => b.x == 4
- In der letzten Zeile wird ein neues A-Objekt erzeugt mit einem Long-Objekt (Wert: 3L) als Parameter. Für dieses wird der "double"-Konstruktor von A ausgeführt. Dieser verringert A.x um den angegebenen Wert, also um 3. Es gilt: A.x == 4 - 3 == 1
- Zum Schluss wird nun das y-Attribut von dem in Schritt 3 erzeugten A-Objekt der
Instanzvariable (EDIT: ist keine, es wird nur so getan als ob) y des B-Objekts zugewiesen. Da das y-Attribut weder Instanzvariable von der einen noch von der anderen Klasse ist, könnte dort auch B.y = A.y
stehen.
Ich hoffe, dass ich mich nirgends vertan habe
