Miért rendeződik át a lista?
> Example.java:
public class Example {
____ private ArrayList<SomeObject> objects;
____ Example(final ArrayList<SomeObject> objects) {
________ this.objects = objects;
________ doTheJob();
____ }
____ private void doTheJob() {
________ processes.sortByAlphabet();
____ }
}
> Other.java:
public class Other {
____ private ArrayList<SomeObject> objects;
____ private Example example;
____ objects = populate(); // a fgv. feltölti adatokkal az objects array-t
____ example = new Example(objects);
}
--
És akkor a kérdés:
Az Other.java-ban létrehozok egy ArrayList-et, amit átadok az Example osztály konstruktorának.
A konstruktor a kapott ArrayList-et eltárolja a saját private ArrayList-jében, majd ABC sorrendbe rendezi annak a tartalmát.
A kérdés, hogy ezek után ha for()-al kilistázom az Other class "objects" ArrayList-jét, akkor azt látom, hogy az is ugyanúgy ABC sorrendbe rendeződött, pedig a Example-ben lévő rendezőfüggvény nem is ezen a listán dolgozott, hanem a sajátján. Miért rendeződik ugyanúgy ABC sorrendbe ez a lista is, ha nem is azzal dolgozik tovább az Example-ben lévő ABC rendező függvénye?
Javaban az összetett adattípusok referenciaként adódnak át, a primitívek érték szerint.
Herbert Schildt - Java: The Complete Reference, nagyon jó könyv, az aktuális kiadást ajánlom átolvasásra.
Amikor egy primitív adattípust adsz paraméternek, pl int-et, akkor az értékként adódik át, azaz készül egy másolat és az objektum saját adattagja különböző lesz, mint amit a főprogramban van.
Az összetett adattípusok viszont referenciaként adódnak át, azaz ott csak egy mutató fog átadódni, ami az adat memóriabeli helyét mutatja. Mivel magáról az adatról nem készül másolat, így ha az objektum módosítja az adatokat, akkor az eredeti is "módosul" - hiszen ugyanoda mutat a pointer.
Hogy jól értsem, ez a két sor az Example osztályban azt csinálja, hogy tulajdonképpen egy pointerré teszi az ArrayList-et, ami a konstrukorban paraméterül kapott objektumra mutat?
private ArrayList<SomeObject> objects;
{
____this.objects = objects;
}
És mi van akkor, hogyha én azt akarom, hogy lemásolja? C-ben ez tök máshogy működött és nem értem mi ebben a logika Java esetén.
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, 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!