Назад к вопросам
Junior
70
questionbank

Что такое ссылочные типы данных?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Ссылочные типы данных хранят не само значение, а ссылку (адрес в памяти) на место, где это значение находится.

Особенности:

  • Переменные ссылочного типа могут хранить ссылку на null.
  • При присваивании одной переменной ссылочного типа значения другой, копируется не само значение, а ссылка. Обе переменные начинают указывать на одно и то же место в памяти.
  • Изменения, внесенные через одну ссылку, будут видны через другую, если они указывают на один и тот же объект.
  • Память для объектов ссылочных типов управляется сборщиком мусора.

Примеры ссылочных типов данных:

  • Строки (String)
  • Массивы
  • Объекты пользовательских классов
  • Делегаты (в некоторых языках)

Отличие от значимых типов данных:

Характеристика Значимые типы данных Ссылочные типы данных
Хранение Само значение Ссылка на значение
Копирование Копируется само значение Копируется ссылка
Изменение Изменения в копии не влияют на оригинал Изменения через одну ссылку видны через другую (если одна и та же)
Память Управляется стеком (обычно) Управляется кучей, очищается сборщиком мусора
Примеры 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