Ответ
Ссылочный тип (reference type) — это тип данных, переменная которого хранит не само значение, а ссылку (адрес в памяти) на объект, где это значение находится. Все объекты в Java, включая массивы и строки, относятся к ссылочным типам.
| Ключевые отличия от примитивных типов: | Признак | Примитивный тип (int, boolean) | Ссылочный тип (String, Object, массив) |
|---|---|---|---|
| Хранение | Значение | Ссылка на объект в куче (Heap) | |
| Значение по умолчанию | 0, false и т.д. | null |
|
| Передача в метод | По значению (копируется) | По ссылке (копируется адрес) |
Пример, демонстрирующий поведение ссылок:
String a = "Java"; // a ссылается на строковый литерал в пуле строк
String b = a; // b получает копию ссылки из a. Обе переменные указывают на один объект.
b = "Python"; // Теперь b ссылается на новый объект "Python". a по-прежнему указывает на "Java".
int[] arr1 = {1, 2, 3};
int[] arr2 = arr1; // arr2 и arr1 ссылаются на один массив.
arr2[0] = 99; // Изменение через arr2 видно через arr1: arr1[0] теперь тоже 99. Ответ 18+ 🔞
Ну, слушай, вот сидишь ты, пишешь на Java, думаешь, что всё понятно, а тут бац — ссылочные типы. Это ж, блядь, как в жизни: ты не таскаешь с собой диван, а говоришь «он у меня на такой-то улице, в такой-то квартире стоит». Вот и переменная ссылочного типа — она не значение держит, а адресок, где это значение, сука, лежит. Все объекты, массивы, строки — они вот такие, ссылочные.
А примитивы — те, как дурачки, прямо в кармане носят своё число или true/false. Посмотри, как их различать, а то потом охуеешь, когда что-то не сработает:
| Признак | Примитивный тип (int, boolean) | Ссылочный тип (String, Object, массив) |
|---|---|---|
| Хранение | Значение прямо в переменной | Ссылка (адрес) на объект в куче (Heap), блядь |
| Значение по умолчанию | Ноль, false — скукота | null, то есть пустота, нихуя |
| Передача в метод | Копируется значение (как ксерокс) | Копируется ссылка (адрес), а объект-то один, ёпта! |
А теперь пример, чтобы совсем пиздец стало понятно. Смотри:
String a = "Java"; // a теперь тычет пальцем в строку "Java" в пуле
String b = a; // b — это просто копия бумажки с адресом. Оба пальца на один объект!
b = "Python"; // А вот тут b взял и перевел свой палец на новый объект "Python". a по-прежнему на "Java" тычет.
int[] arr1 = {1, 2, 3};
int[] arr2 = arr1; // Опять копия адреса! Обе переменные ведут к одному массиву, как два охранника на одну дверь.
arr2[0] = 99; // arr2 пришёл и в массиве поменял первую цифру. А arr1 заходит — охуеть, там уже 99! Потому что массив-то один, блядь.
Вот и вся магия. Главное — не путать, когда копируется адрес, а когда само значение, а то потом сидишь и думаешь: «Почему у меня всё поломалось, я же только тут тронул?» А потому что тронул в одном месте, а оно везде отразилось, хитрая жопа эти ссылки.