Ответ
Ссылочные типы данных хранят не само значение, а адрес (ссылку) на область памяти, где это значение находится. При присваивании или передаче в функцию копируется именно эта ссылка, а не данные объекта.
Ключевые особенности:
- Общее состояние: Несколько переменных могут ссылаться на один объект. Изменения, сделанные через одну ссылку, видны через все другие.
- Сравнение: Оператор
==(в большинстве языков) сравнивает ссылки (адреса в памяти), а не содержимое объектов. - Null-значение: Ссылочные переменные могут иметь специальное значение (например,
null,None), указывающее на отсутствие объекта. - Распространённые примеры: Объекты, массивы, коллекции, строки (в некоторых языках).
Пример на Java:
import java.util.ArrayList;
import java.util.List;
public class ReferenceExample {
public static void main(String[] args) {
// list1 и list2 ссылаются на один и тот же объект в куче (heap)
List<String> list1 = new ArrayList<>();
list1.add("test");
List<String> list2 = list1;
list2.add("another");
System.out.println(list1); // Выведет: [test, another]
System.out.println(list1 == list2); // true (ссылки равны)
// Сравнение содержимого требует специального метода
List<String> list3 = new ArrayList<>(list1);
System.out.println(list1.equals(list3)); // true (содержимое одинаково)
System.out.println(list1 == list3); // false (это разные объекты)
}
}
Противопоставление: В отличие от примитивных (значимых) типов (например, int, boolean), которые хранят значение непосредственно и копируются по значению.