Sobes.tech
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