Junior
Kas yra nuorodų duomenų tipai?
sobes.tech AI
Atsakymas iš AI
Nuorodų tipų duomenys saugo ne pačią reikšmę, o nuorodą (adresą atmintyje) į vietą, kur ši reikšmė yra.
Ypatybės:
- Nuorodų tipo kintamieji gali saugoti
nullreikšmę. - Kai vieno nuorodų tipo kintamojo reikšmė priskiriama kitam, kopijuojama ne pati reikšmė, o nuoroda. Abu kintamieji pradeda rodyti į tą patį atminties vietą.
- Pakeitimai, atlikti per vieną nuorodą, bus matomi per kitą, jei jie rodo į tą patį objektą.
- Atmintis nuorodų tipų objektams valdomas šiukšlių surinkėjo.
Nuorodų tipų pavyzdžiai:
- Eilutės (
String) - Masyvai
- Naudotojo klasių objektai
- Delegatai (kai kuriose kalbose)
Skirtumas nuo reikšmių tipų:
| Savybė | Reikšmių tipai | Nuorodų tipai |
|---|---|---|
| Saugojimas | Savo reikšmė | Nuoroda į reikšmę |
| Kopijavimas | Kopijuojama pati reikšmė | Kopijuojama nuoroda |
| Pakeitimai | Pakeitimai kopijoje neveikia originalo | Pakeitimai per vieną nuorodą matomi per kitą (jei rodo į tą patį objektą) |
| Atmintis | Valdoma iššaukiant steką (stack) | Valdoma krūvos, išvaloma šiukšlių surinkėju |
| Pavyzdžiai | int, float, bool, struct (kai kuriose kalbose) |
String, Array, Object |
// Pavyzdys C#
string s1 = "Hello"; // s1 rodo į eilutę "Hello"
string s2 = s1; // s2 rodo į tą patį nuorodą kaip ir s1
// Pakeitimai nebus matomi per kitą nuorodą,
// nes eilutės C# yra nekeičiamos.
// Pakeitus, sukuriama nauja eilutė ir nuoroda peradresuojama.
s1 = "World";
Console.WriteLine(s2); // Išveda "Hello"
int[] arr1 = { 1, 2, 3 }; // arr1 rodo į masyvą {1, 2, 3}
int[] arr2 = arr1; // arr2 rodo į tą patį nuorodą
arr2[0] = 10; // Pakeitimas per arr2
Console.WriteLine(arr1[0]); // Išveda 10, pakeitimas matomas ir per arr1
// Pavyzdys Java
String s1 = "Hello"; // s1 rodo į eilutę "Hello"
String s2 = s1; // s2 rodo į tą patį nuorodą kaip ir s1
// Eilutės Java yra nekeičiamos.
// Pakeitus, sukuriama nauja eilutė ir nuoroda peradresuojama.
s1 = "World";
System.out.println(s2); // Išveda "Hello"
int[] arr1 = { 1, 2, 3 }; // arr1 rodo į masyvą {1, 2, 3}
int[] arr2 = arr1; // arr2 rodo į tą patį nuorodą
arr2[0] = 10; // Pakeitimas per arr2
System.out.println(arr1[0]); // Išveda 10, pakeitimas matomas ir per arr1