Det här är en viktig problematik som du måste ta dig tid att behärska. Notera att samma frågeställning kommer igen när du passar ett objekt vid metodanrop, returnerar ett objekt, lagrar objekt i en datastruktur etc.
Vi börjar med ett enkelt exempel:
Person x; Person y; x = new Person (); y = x; x.ålder = 42; x.namn = "Kalle Karlsson";
Hur gammal är y
?
Allmänt gäller att om vi har en klassdefinition
class X { ... }
och en variabeldeklaration
X a;
så lagrar variabeln a
en referens.
När a
tilldelas eller används i något sammanhang kopieras
referensen. Objektet kopieras inte.
Exempel:
X a, b; a = new X(); b = a;
Efter koden har körts refererar a
och b
till samma objekt.
new
.public class Person { int age; void incrementAge() { age = age + 1; } }
En klassdefinition kan även innehålla definitioner av metoder.
Metoder liknar funktioner i C, men en metod kan referera till klassens instansvariabler.
Med en metoddefinition
void f(X c) { ... }
och ett anrop
f(a)
kommer variabeln c
inom metodkroppen att referera till samma
objekt som a
Regel: Objekt kopieras aldrig
(om man inte uttryckligen ber om det).