Java paraméterátadás. Hogy van akkor?
Szóval minden esetben pass-by-value van? És ilyenkor mi történik belül? Pl ha van egy someMethod(SomeObject arg), akkor ha meghívom, a someMethod-ot valamilyen paraméterrel, akkor létrejön egy új objektum, ami megkapja az átadott paraméter értékeit, és az arg referencia mutat rá? Vagy az arg referencia fog mutatni az átadott paraméterre is?
Illetve, akkor hogyan kell egy olyan swap(Integer, Integer) metódust írni, ami megcseréli a kettőt? Tehát a hívás után megcserélődtek az értékek?
Java-ban az adattípusok két nagy csoportba oszthatók:
- primitív típusok: Ezek azok az adattípusok, amiket tovább már nem tudunk boncolni. Ilyenek például az int, char, float, double, boolean stb.
- valamint vannak az összetett típusok, amelyek úgy állnak elő, hogy egy vagy több primitív vagy összetett típusú adatot egy egységként kezelünk. Ilyen adattípus például a tömb és az osztály.
Amíg egy primitív típust adsz át paraméterként, maga a konkrét érték fog lemásolódni:
public void DoSomething(int x) {
.. x = 6;
}
int i = 5;
System.out.printf("Módosítás előtt: %d\n", i);
DoSomething(i);
System.out.printf("Módosítás után: %d\n", i);
A kimenet:
Módosítás előtt: 5
Módosítás után: 5
Jelen két memóriaterületet kell nézni. Van egy memóriaterülete az i-nek és van egy memóriaterülete az x-nek. Az x memóriaterületére az i értéke átmásolódott, tehát amit a DoSomething 6-ra módosít, az a másolat volt, nem az eredeti érték. Ezért nem változott az i értéke.
Ellenben összetett típus esetén minden érték csak egyszer létezik a memóriában. Ebben az esetben azt fogjuk tárolni, hogy ezt az egyetlen egy példányt hol találjuk meg a memóriában.
class Dummy { int x; }
public void DoSomething(Dummy obj) {
.. if (obj == null)
.. .. return; //NullReferenceException védelem
.. obj.x = 6;
}
Dummy i = new Dummy();
i.x = 5;
System.out.printf("Módosítás előtt: %d\n", i.x);
DoSomething(i);
System.out.printf("Módosítás után: %d\n", i.x);
A kimenet:
Módosítás előtt: 5
Módosítás után: 6
Mivel a paraméterátadás során nem a konkrét érték másolódott le, hanem csak azt mondtuk meg, hogy a már létező objektumot hol találja a memóriában, ezért csupán csak az eredeti objektum létezik. Mivel az eredeti objektumot módosítottuk, a változtatás a hívás helyén is látható.
Mivel csak érték szerint lehet átadni paramétereket (objektum átadása esetén is a referencia érték szerint kerül átadásra), ezért a legjobb amit tehetsz:
int swap(int a, int b) {
return a;
}
használat:
y = swap(x, x=y);
Értem köszönöm a válaszokat.
Tehát referencia esetén úgy értsem, hogy egy aliasing jön létre metódushíváskor?
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!