Call-by-reference sau call-by-value în Java?
Cei care ați făcut C sau C++ vă aduceți aminte de așa numitele transmiteri de parametri prin valoare sau prin referință. În Java nu există ‘sau’ ci doar call-by-value, indiferent de tipul parametrului.
În momentul în care apelăm o metodă cu parametrii primitivi atunci valoarea lor este transmisă parametrilor formali din metodă. În cazul unor obiecte, valoarea referință este transmisă parametrilor formali și nu obiectul cu totul. Ceea ce înseamnă că și parametrul formal, dar și parametrul inițial din apel vor referenția același obiect din memorie. Acest lucru are cel puțin două consecințe:
- Orice modificări făcute asupra stării obiectului referențiat de către parametrul formal, vor fi vizibile și după încheierea apelului metodei;
- Dacă modificăm parametrul formal din metodă(deci nu starea obiectului referențiat de el), modificarea nu va fi vizibilă după ieșirea din apel.
1: public class Test {
2: public String rezultat = "bun";
3: public Test() {
4: System.out.println("Constructor din Test");
5: }
6:
7: public void schimba(Test tst) {
8: tst.rezultat = "rau";
9: tst = null;
10: }
11:
12: public static void main(String[] args) {
13: Test tst = new Test();
14: System.out.println(tst.rezultat);
15: tst.schimba(tst);
16: System.out.println(tst.rezultat);
17: }
18: }
După compilare și rulare, acest program va afișa:
Constructor din Test
bun
rau
La linia 8 se modifică starea obiectului Test referențiat de parametrul formal tst, iar la linia 9 se asociază lui tst valoarea null. Modificarea asupra atributului rezultat se poate observa la ieșirea din apelul metodei schimbă.
