Kezdőoldal » Számítástechnika » Programozás » Java paraméterátadás. Hogy...

Java paraméterátadás. Hogy van akkor?

Figyelt kérdés

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?



2017. márc. 15. 20:56
 1/3 anonim ***** válasza:
8%

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

2017. márc. 15. 21:37
Hasznos számodra ez a válasz?
 2/3 anonim ***** válasza:

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

2017. márc. 16. 08:14
Hasznos számodra ez a válasz?
 3/3 A kérdező kommentje:

É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?

2017. márc. 16. 10:42

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!