Sobes.tech
Junior

Mi a referencia típusok?

sobes.tech MI

Válasz az MI-től

A hivatkozási típusok nem magát az értéket tárolják, hanem egy hivatkozást (memóriacím) arra a helyre, ahol ez az érték található.

Jellemzők:

  • A hivatkozási típusú változók tárolhatnak null hivatkozást.
  • Amikor egy hivatkozási típusú változó értékét egy másiknak adjuk, nem az érték másolódik, hanem a hivatkozás. Mindkét változó ugyanarra a helyre mutat a memóriában.
  • Az egyik hivatkozáson keresztül végzett módosítások láthatók a másikon is, ha ugyanarra az objektumra mutatnak.
  • A hivatkozási típusú objektumok memóriája a garbage collector által van kezelve.

Példák hivatkozási típusokra:

  • Szövegek (String)
  • Tömbök
  • Egyéni osztályobjektumok
  • Delegáltak (bizonyos nyelveken)

Különbség a értéktípusokhoz képest:

Jellemző Értéktípusok Hivatkozási típusok
Tárolás Maga az érték Hivatkozás az értékre
Másolás Az érték másolódik A hivatkozás másolódik
Módosítás A másolat módosítása nem befolyásolja az eredetit A módosítások láthatók a másik hivatkozáson keresztül, ha ugyanarra az objektumra mutatnak
Memória Általában a verem (stack) kezeli A heap, a garbage collector tisztítja
Példák int, float, bool, struct (bizonyos nyelveken) String, Array, Object
// Példa C#-ban
string s1 = "Hello"; // s1 egy "Hello" sztringre mutat
string s2 = s1;      // s2 ugyanarra a hivatkozásra mutat

// Módosítás nem látszik a másik hivatkozásnál, 
// mert a stringek immutábilisak C#-ban. 
// Módosításkor új string jön létre, és a hivatkozás át lesz irányítva.
s1 = "World"; 

Console.WriteLine(s2); // "Hello"-t ír ki

int[] arr1 = { 1, 2, 3 }; // arr1 egy tömbre mutat
int[] arr2 = arr1;     // arr2 ugyanarra a tömbre mutat

arr2[0] = 10;          // Módosítás az arr2-n keresztül

Console.WriteLine(arr1[0]); // 10-et ír ki, a módosítás látszik az arr1-ben is

// Példa Java-ban
String s1 = "Hello"; // s1 egy "Hello" sztringre mutat
String s2 = s1;      // s2 ugyanarra a hivatkozásra mutat

// A stringek Java-ban immutábilisak. 
// Módosításkor új string jön létre, és a hivatkozás át lesz irányítva.
s1 = "World"; 

System.out.println(s2); // "Hello"-t ír ki

int[] arr1 = { 1, 2, 3 }; // arr1 egy tömbre mutat
int[] arr2 = arr1;     // arr2 ugyanarra a tömbre mutat

arr2[0] = 10;          // Módosítás az arr2-n keresztül

System.out.println(arr1[0]); // 10-et ír ki, a módosítás látszik az arr1-ben is