Variabler och referenssemantik

Sven-Olof Nyström
OOP med Java våren -25
Informationsteknologi
Uppsala Universitet

Variabler och referenssemantik

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.

Regel

Metoder

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.

Referensvariabler i metodanrop

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).