Szia Amigo! A változók belső szerkezetéről szeretnék beszélni. Amint azt már tudja, minden változó egy memóriaterülethez van társítva, ahol az értéke tárolódik. "

– Igen. A múltkor meséltél erről.

– Remek. Jó, hogy emlékszel. Akkor folytatom.

"Minden összetett típus egyszerűbbekből áll. Ezek pedig még egyszerűbbekből állnak. Amíg végül a primitív típusokhoz jutunk , amelyeket nem lehet tovább egyszerűsíteni. Így hívják őket primitív típusoknak . Például az int egy primitív típus, de a String egy összetett típus, amely karaktertáblázatként tárolja adatait (ahol minden karakter primitív típusú char )."

"Nagyon érdekes. Folytasd."

"Az összetett típusok az egyszerűek csoportosításával jönnek létre. Az ilyen típusokat osztályoknak nevezzük . Amikor egy új osztályt definiálunk egy programban, új összetett adattípust deklarálunk . Adatai vagy más összetett típusok vagy primitív típusok lesznek."

Java kód Leírás
public class Person
{
   String name;
   int age;
}
Új összetett típust deklarálunk – Person.
Adatai az String(összetett típusú) változóban nameés inta (primitív típusú) változóban tárolódnakage
public class Rectangle
{
   int x, y, width, height;
}
Új összetett típust deklarálunk – Rectangle. Négy (primitív típusú) változóból
áll .int
public class Cat
{
   Person owner;
   Rectangle territory;
   int age;
   String name;
}
Új összetett típust deklarálunk – Cat. A következő változókkal rendelkezik:
owner, kompozit típus Person
territory, összetett típus Rectangle
age, primitív típus int
name, összetett típusString

– Egyelőre minden világos, bármilyen furcsának is tűnik.

"A nagy (összetett) típusok sok kicsi (primitív) típust tartalmaznak. Ezért az ilyen típusú objektumok sok memóriát foglalnak el - többet, mint a primitív típusok változói. Néha sokkal többet. Az ilyen változókkal való hozzárendelési műveletek végrehajtása sokáig tartott időigényes és nagy memóriarészek másolására volt szükség, ezért az összetett típusú változók nem magát az objektumot tárolják, hanem csak egy hivatkozást, vagyis annak négybájtos címét, ami elegendő az ilyen objektumok adatainak címezéséhez. A Java gép kezeli az összes kapcsolódó bonyolultságot."

– Ebből semmit nem értettem.

"Korábban azt mondtuk, hogy a változó olyan, mint egy doboz. Ha el akarja tárolni benne a 13-as számot, felírhatja a 13-at egy papírra, és beleteheti a dobozba."

"De képzeld el, hogy valami nagyobbat kell tárolnod a dobozban (változó). Például egy kutyát, egy autót vagy a szomszédodat. Ahelyett, hogy megpróbálnád benyomni a nem tolhatót a dobozba, csinálhatsz valami egyszerűbbet is: használj fényképet a kutyáról a valódi kutya helyett, rendszámot a valódi autó helyett, vagy a szomszéd telefonszámát a szomszéd helyett."

"Vegyünk egy papírt, és felírjuk a szomszéd telefonszámát. Ez olyan, mint egy tárgyra való hivatkozás. Ha kimásoljuk azt a papírt, amelyen a szomszéd telefonszáma van, és több dobozba rakjuk, akkor most több hivatkozás található. a szomszédodnak. De mint korábban, most is csak egy szomszédod van. Ennek van értelme, nem?

"Az ilyen módon történő adattárolás egyik fontos jellemzője, hogy sok hivatkozás lehet egyetlen objektumra. "

"Milyen érdekes! Már majdnem értem. Mondja el még egyszer, kérem, mi történne, ha egy összetett típusú változót egy másik, azonos típusú változóhoz rendelnék?"

"Akkor a két változó ugyanazt a címet tárolná. Ez azt jelenti, hogy ha megváltoztatja az egyik változó által hivatkozott objektum adatait, akkor módosítja a másik által hivatkozott adatokat . Mindkét változó ugyanarra az objektumra hivatkozik . Természetesen sok lehet más változók, amelyek szintén tárolnak rá hivatkozásokat."

"Mit csinálnak az összetett (hivatkozás/osztály) típusú változók, ha nem tartalmaznak hivatkozást egy objektumra? Ez egyáltalán lehetséges?"

"Igen, Amigo. Előre jársz a kérdéseddel. Ez lehetséges. Ha egy referencia (összetett) típusú változó nem tárol hivatkozást egy objektumra, akkor az úgynevezett "null"-ot tárolja. Ez alapvetően azt jelenti, hogy olyan objektumra hivatkozik, amelynek a címe 0. A Java gép azonban soha nem hoz létre objektumokat ezzel a címmel, így mindig tudja, hogy ha egy referenciaváltozó 0-t tartalmaz, akkor nem mutat semmilyen objektumra ."

Java kód Leírás
String s;
String s = null;
Egyenértékű állítások.
Person person;
person = new Person();
person = null;
Létrehozunk egy személy változót, amelynek értéke null.
Hozzárendeljük egy újonnan létrehozott Person objektum címét.
A változóhoz nullát rendelünk.
Cat cat = new Cat();
cat.owner = new Person();
cat.owner.name = "God";
Létrehozunk egy Cat objektumot, és a címét a cat változóban tároljuk; macska.tulajdonos egyenlő nullával.
A cat.owner értéket egy újonnan létrehozott Person objektum címével egyenlőnek állítottuk be.
cat.owner.name továbbra is nulla.
A macska.tulajdonos.nevet egyenlőnek állítottuk az "Isten" értékkel

"Jól értettem? A változókat két típusra osztják: primitív típusokra és hivatkozási típusokra. A primitív típusok közvetlenül tárolják az értékeket, míg a referenciatípusok egy objektumra való hivatkozást. A primitív típusok közé tartozik az int, char, boolean és sok más. Hivatkozás A típusok minden mást tartalmaznak. Osztályokat használunk a létrehozásukhoz."

– Teljesen igazad van, fiam.

"Tehát azt mondja, hogy mindent megértett. Íme néhány feladat, amelyek segítenek megerősíteni tudását."