Junior
Какви са референтните типове данни?
sobes.tech AI
Отговор от AI
Типовете данни с препратки не съхраняват самата стойност, а препратка (адрес в паметта) към мястото, където тази стойност се намира.
Характеристики:
- Променливите от тип препратка могат да съдържат
null. - При присвояване на стойност от една променлива към друга, не се копира самата стойност, а препратката. И двете променливи започват да сочат към едно и също място в паметта.
- Промените, направени чрез една препратка, ще бъдат видими чрез другата, ако и двете сочат към един и същ обект.
- Паметта за обектите от тип препратка се управлява от garbage collector.
Примери за типове данни с препратки:
- Стрингове (
String) - Масиви
- Обекти на потребителски класове
- Делегати (в някои езици)
Разлика от стойностните типове:
| Характеристика | Стойностни типове | Типове данни с препратки |
|---|---|---|
| Съхранение | Самата стойност | Препратка към стойността |
| Копиране | Копира се самата стойност | Копира се препратката |
| Модифициране | Модификациите в копието не влияят на оригинала | Модификациите чрез една препратка са видими чрез другата (ако сочат към един и същ обект) |
| Памет | Управлява се от стека (stack) | Управлява се от купчината, почиства се от garbage collector |
| Примери | int, float, bool, struct (в някои езици) |
String, Array, Object |
// Пример на C#
string s1 = "Hello"; // s1 сочи към стринг "Hello"
string s2 = s1; // s2 сочи към същия препратка като s1
// При промяна няма да е видимо през другата препратка,
// защото стринговете са иммутабилни в C#.
// При промяна се създава нов стринг и препратката се пренасочва.
s1 = "World";
Console.WriteLine(s2); // Извежда "Hello"
int[] arr1 = { 1, 2, 3 }; // arr1 сочи към масив {1, 2, 3}
int[] arr2 = arr1; // arr2 сочи към същия препратка
arr2[0] = 10; // Промяна чрез arr2
Console.WriteLine(arr1[0]); // Извежда 10, промяната е видима чрез arr1
// Пример на Java
String s1 = "Hello"; // s1 сочи към стринг "Hello"
String s2 = s1; // s2 сочи към същия препратка като s1
// Стрингите в Java са иммутабилни.
// При промяна се създава нов стринг и препратката се пренасочва.
s1 = "World";
System.out.println(s2); // Извежда "Hello"
int[] arr1 = { 1, 2, 3 }; // arr1 сочи към масив {1, 2, 3}
int[] arr2 = arr1; // arr2 сочи към същия препратка
arr2[0] = 10; // Промяна чрез arr2
System.out.println(arr1[0]); // Извежда 10, промяната е видима чрез arr1