Sobes.tech
Junior

Czym są typy danych referencyjnych?

sobes.tech AI

Odpowiedź od AI

Typy danych referencyjnych przechowują nie samą wartość, lecz odwołanie (adres w pamięci) do miejsca, gdzie ta wartość się znajduje.

Cechy:

  • Zmienne typu referencyjnego mogą przechowywać odwołanie do null.
  • Przypisując wartość jednej zmiennej typu referencyjnego do innej, kopiowana jest nie sama wartość, lecz odwołanie. Obie zmienne wskazują na to samo miejsce w pamięci.
  • Zmiany dokonane przez jedno odwołanie będą widoczne przez drugie, jeśli wskazują na ten sam obiekt.
  • Pamięć dla obiektów typu referencyjnego jest zarządzana przez garbage collector.

Przykłady typów danych referencyjnych:

  • Ciągi znaków (String)
  • Tablice
  • Obiekty klas użytkownika
  • Delegaty (w niektórych językach)

Różnice w stosunku do typów wartości:

Charakterystyka Typy wartości Typy referencyjne
Przechowywanie Sama wartość Odwołanie do wartości
Kopiowanie Kopiuje się sama wartość Kopiuje się odwołanie
Modyfikacja Zmiany w kopii nie wpływają na oryginał Zmiany przez jedno odwołanie są widoczne przez drugie (jeśli wskazują na ten sam obiekt)
Pamięć Zarządzana przez stos (zazwyczaj) Zarządzana przez stertę, zwalniana przez garbage collector
Przykłady int, float, bool, struct (w niektórych językach) String, Array, Object
// Przykład w C#
string s1 = "Hello"; // s1 przechowuje odwołanie do ciągu "Hello"
string s2 = s1;      // s2 teraz przechowuje to samo odwołanie co s1

// Przy zmianie, nie będzie widoczne przez drugie odwołanie,
// ponieważ ciągi w C# są niezmiennicze.
// Przy zmianie tworzony jest nowy ciąg, a odwołanie jest ponownie przypisywane.
s1 = "World"; 

Console.WriteLine(s2); // Wypisze "Hello"

int[] arr1 = { 1, 2, 3 }; // arr1 przechowuje odwołanie do tablicy {1, 2, 3}
int[] arr2 = arr1;     // arr2 teraz przechowuje to samo odwołanie

arr2[0] = 10;          // Zmiana przez arr2

Console.WriteLine(arr1[0]); // Wypisze 10, zmiana widoczna przez arr1

// Przykład w Java
String s1 = "Hello"; // s1 przechowuje odwołanie do ciągu "Hello"
String s2 = s1;      // s2 teraz przechowuje to samo odwołanie co s1

// Ciągi w Java są niezmiennicze.
// Przy zmianie tworzony jest nowy ciąg, a odwołanie jest ponownie przypisywane.
s1 = "World"; 

System.out.println(s2); // Wypisze "Hello"

int[] arr1 = { 1, 2, 3 }; // arr1 przechowuje odwołanie do tablicy {1, 2, 3}
int[] arr2 = arr1;     // arr2 teraz przechowuje to samo odwołanie

arr2[0] = 10;          // Zmiana przez arr2

System.out.println(arr1[0]); // Wypisze 10, zmiana widoczna przez arr1