Sobes.tech
Junior

Čo sú referenčné typy údajov?

sobes.tech AI

Odpoveď od AI

Typy údajov s odkazmi ne ukladajú samotnú hodnotu, ale odkaz (adresu v pamäti) na miesto, kde sa táto hodnota nachádza.

Charakteristiky:

  • Premenné odkazového typu môžu obsahovať null.
  • Pri priraďovaní hodnoty jednej premennej odkazového typu inej, sa nekopíruje samotná hodnota, ale odkaz. Obe premenne začnú ukazovať na rovnaké miesto v pamäti.
  • Zmeny vykonané cez jeden odkaz budú viditeľné cez druhý, ak ukazujú na ten istý objekt.
  • Pamäť pre objekty odkazových typov je spravovaná garbage collectorom.

Príklady odkazových typov:

  • Reťazce (String)
  • Polia
  • Objektové triedy používateľských definícií
  • Delegáti (v niektorých jazykoch)

Rozdiel od hodnotových typov:

Charakteristika Hodnotové typy Typy údajov s odkazmi
Uloženie Samotná hodnota Odkaz na hodnotu
Kopírovanie Kopíruje sa samotná hodnota Kopíruje sa odkaz
Zmena Zmeny v kópii neovplyvnia originál Zmeny cez jeden odkaz sú viditeľné cez druhý (ak ukazujú na ten istý objekt)
Pamäť Riadi sa zásobníkom (stack) Riadi sa haldou, čistí sa garbage collectorom
Príklady int, float, bool, struct (v niektorých jazykoch) String, Array, Object
// Príklad v C#
string s1 = "Hello"; // s1 ukazuje na reťazec "Hello"
string s2 = s1;      // s2 ukazuje na rovnakú referenciu ako s1

// Pri zmene nebude vidieť cez druhú referenciu,
// pretože reťazce sú v C# nemenné. 
// Pri zmene sa vytvorí nový reťazec a referencia sa preusmerí.
s1 = "World"; 

Console.WriteLine(s2); // Vypíše "Hello"

int[] arr1 = { 1, 2, 3 }; // arr1 ukazuje na pole {1, 2, 3}
int[] arr2 = arr1;     // arr2 ukazuje na rovnakú referenciu

arr2[0] = 10;          // Zmena cez arr2

Console.WriteLine(arr1[0]); // Vypíše 10, zmena je viditeľná cez arr1
// Príklad v Jave
String s1 = "Hello"; // s1 ukazuje na reťazec "Hello"
String s2 = s1;      // s2 ukazuje na rovnakú referenciu ako s1

// Reťazce v Jave sú nemenné.
// Pri zmene sa vytvorí nový reťazec a referencia sa preusmerí.
s1 = "World"; 

System.out.println(s2); // Vypíše "Hello"

int[] arr1 = { 1, 2, 3 }; // arr1 ukazuje na pole {1, 2, 3}
int[] arr2 = arr1;     // arr2 ukazuje na rovnakú referenciu

arr2[0] = 10;          // Zmena cez arr2

System.out.println(arr1[0]); // Vypíše 10, zmena je viditeľná cez arr1