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