Junior
Co jsou referenční datové typy?
sobes.tech AI
Odpověď od AI
Referenční datové typy ne ukládají samotnou hodnotu, ale odkaz (adresu v paměti) na místo, kde se tato hodnota nachází.
Vlastnosti:
- Referenční typové proměnné mohou obsahovat odkaz na
null. - Při přiřazení hodnoty jedné referenční proměnné jiné, se nekopíruje samotná hodnota, ale odkaz. Obě proměnné začnou ukazovat na stejné místo v paměti.
- Změny provedené přes jeden odkaz budou viditelné přes druhý, pokud odkazují na stejný objekt.
- Paměť pro objekty referenčních typů je spravována garbage collectorem.
Příklady referenčních typů:
- Řetězce (
String) - Pole
- Objektové třídy uživatelských definic
- Delegáti (v některých jazycích)
Rozdíl od hodnotových typů:
| Charakteristika | Hodnotové typy | Referenční typy |
|---|---|---|
| Uložení | Samotná hodnota | Odkaz na hodnotu |
| Kopírování | Kopíruje se samotná hodnota | Kopíruje se odkaz |
| Změna | Změny v kopii neovlivní originál | Změny přes jeden odkaz jsou viditelné přes druhý (pokud odkazují na stejný objekt) |
| Paměť | Řídí se zásobníkem (stackem) | Spravována haldou, je čištěna garbage collectorem |
| Příklady | int, float, bool, struct (v některých jazycích) |
String, Array, Object |
// Příklad v C#
string s1 = "Hello"; // s1 ukazuje na řetězec "Hello"
string s2 = s1; // s2 ukazuje na stejný odkaz jako s1
// Při změně nebude vidět přes druhý odkaz,
// protože řetězce jsou v C# neměnné.
// Při změně se vytvoří nový řetězec a odkaz se přenastaví.
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 stejný odkaz
arr2[0] = 10; // Změna přes arr2
Console.WriteLine(arr1[0]); // Vypíše 10, změna je vidět přes arr1
// Příklad v Java
String s1 = "Hello"; // s1 ukazuje na řetězec "Hello"
String s2 = s1; // s2 ukazuje na stejný odkaz jako s1
// Řetězce v Java jsou neměnné.
// Při změně se vytvoří nový řetězec a odkaz se přenastaví.
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 stejný odkaz
arr2[0] = 10; // Změna přes arr2
System.out.println(arr1[0]); // Vypíše 10, změna je vidět přes arr1