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

Ответ

Ссылочный тип (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! Потому что массив-то один, блядь.

Вот и вся магия. Главное — не путать, когда копируется адрес, а когда само значение, а то потом сидишь и думаешь: «Почему у меня всё поломалось, я же только тут тронул?» А потому что тронул в одном месте, а оно везде отразилось, хитрая жопа эти ссылки.