Sobes.tech
Junior

Cum sunt transmise parametrii în metodele din Java?

sobes.tech AI

Răspuns de la AI

În Java, parametrii din metode sunt transmişi prin valoare (pass-by-value).

Tipuri primitive:

  • Se transmite o copie a valorii primitive. Modificarea parametrului în interiorul metodei nu afectează variabila originală din afara acesteia.
// Exemplu pentru tip primitiv
public void changeValue(int x) {
    x = x + 10; // Se modifică copia lui x din interiorul metodei
}

// Utilizare:
int original = 5;
changeValue(original);
// original va rămâne 5

Obiecte (tipuri referențiale):

  • Se transmite o copie a referinței către obiect. Ambele referințe (cea originală și cea din parametru) indică același obiect în memorie.
  • Modificarea stării obiectului (de exemplu, apelarea unui setter, modificarea câmpurilor) prin referința transmisă în metodă va afecta obiectul original.
  • Reasignarea parametrului la un nou obiect în interiorul metodei nu va schimba referința originală din afara acesteia.
// Exemplu pentru tip referențial (obiect)
public class MyObject {
    private int value;

    public MyObject(int value) {
        this.value = value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

public void modifyObject(MyObject obj) {
    obj.setValue(100); // Se modifică starea obiectului original
}

public void reassignObject(MyObject obj) {
    obj = new MyObject(200); // Parametrul obj acum indică către un nou obiect, referința originală nu se schimbă
}

// Utilizare:
MyObject originalObject = new MyObject(10);
modifyObject(originalObject);
// originalObject are acum value = 100

MyObject anotherObject = new MyObject(50);
reassignObject(anotherObject);
// anotherObject încă indică către obiectul original cu value = 50

Pe scurt: Se transmite valoarea referinței (adresa), nu obiectul în sine. Acest lucru permite modificarea obiectului prin această referință, dar nu schimbarea referinței originale pentru a indica către alt obiect.