Sobes.tech
Junior

Šta su referentni tipovi podataka?

sobes.tech АИ

Одговор од АИ

Tipovi podataka sa referencama ne čuvaju samu vrednost, već referencu (adresu u memoriji) na mesto gde se ta vrednost nalazi.

Karakteristike:

  • Promenljive referentnog tipa mogu sadržavati null.
  • Pri dodeljivanju vrednosti jednoj promenljivoj referentnog tipa drugoj, ne kopira se sama vrednost, već referenca. Obje promenljive počinju da ukazuju na isto mesto u memoriji.
  • Promene izvršene putem jedne reference biće vidljive putem druge, ako ukazuju na isti objekat.
  • Memorija za objekte referentnih tipova upravlja se od strane garbage collectora.

Primeri referentnih tipova:

  • Stringovi (String)
  • Nizovi
  • Objekti korisničkih klasa
  • Delegati (u nekim jezicima)

Razlika u odnosu na vrednosne tipove:

Karakteristika Vrednosni tipovi Tipovi podataka sa referencama
Skladištenje Sama vrednost Referenca na vrednost
Kopiranje Kopira se sama vrednost Kopira se referenca
Izmena Izmene u kopiji ne utiču na original Izmene putem jedne reference su vidljive putem druge (ako ukazuju na isti objekat)
Memorija Upravlja se od strane steka (stack) Upravlja se od strane hrpe, čisti se od strane garbage collectora
Primeri int, float, bool, struct (u nekim jezicima) String, Array, Object
// Primer u C#
string s1 = "Hello"; // s1 ukazuje na string "Hello"
string s2 = s1;      // s2 ukazuje na istu referencu kao i s1

// Pri promeni neće biti vidljivo preko druge reference,
// jer su stringovi u C# imutabilni. 
// Pri promeni se kreira novi string i referenca se preusmerava.
s1 = "World"; 

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

int[] arr1 = { 1, 2, 3 }; // arr1 ukazuje na niz {1, 2, 3}
int[] arr2 = arr1;     // arr2 ukazuje na istu referencu

arr2[0] = 10;          // Izmena preko arr2

Console.WriteLine(arr1[0]); // Ispisuje 10, izmena je vidljiva preko arr1
// Primer u Javi
String s1 = "Hello"; // s1 ukazuje na string "Hello"
String s2 = s1;      // s2 ukazuje na istu referencu kao i s1

// Stringovi u Javi su imutabilni.
// Pri promeni se kreira novi string i referenca se preusmerava.
s1 = "World"; 

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

int[] arr1 = { 1, 2, 3 }; // arr1 ukazuje na niz {1, 2, 3}
int[] arr2 = arr1;     // arr2 ukazuje na istu referencu

arr2[0] = 10;          // Izmena preko arr2

System.out.println(arr1[0]); // Ispisuje 10, izmena je vidljiva preko arr1