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