В чем разница между передачей по значению и по ссылке?

Ответ

Это два принципиально разных механизма передачи аргументов в функции/методы.

Критерий Передача по значению (Java) Передача по ссылке (C++, Pascal)
Что передается Копия значения переменной. Фактический адрес или псевдоним (alias) исходной переменной.
Изменение параметра Изменения параметра внутри метода не влияют на исходный аргумент. Изменения параметра внутри функции напрямую меняют исходный аргумент.
Аналогия Вы даете кому-то ксерокопию документа. Изменения на копии не затрагивают оригинал. Вы даете кому-то ссылку на онлайн-документ. Изменения по ссылке меняют исходный файл.

Java использует ТОЛЬКО передачу по значению. Для ссылочных типов передается копия ссылки, что ошибочно можно принять за "передачу по ссылке", но это не так.

Контрольный пример на C++:

// Передача по ссылке в C++
void swap(int &x, int &y) { int temp = x; x = y; y = temp; }
int a = 5, b = 10;
swap(a, b); // Теперь a == 10, b == 5. Аргументы поменялись местами.

В Java аналогичная функция swap для примитивов невозможна, что и доказывает отсутствие передачи по ссылке.

Ответ 18+ 🔞

Давай разберём эту дичь, а то народ путается, как слепой кот в сортире. Смотри, есть два способа запихнуть аргумент в функцию — по значению и по ссылке. И это, блядь, как небо и земля, как водка и кефир.

Вот табличка, чтобы не еб@ть мозг:

Критерий Передача по значению (Java) Передача по ссылке (C++, Pascal)
Что передается Копия значения переменной. Фактический адрес или псевдоним (alias) исходной переменной.
Изменение параметра Изменения параметра внутри метода не влияют на исходный аргумент. Изменения параметра внутри функции напрямую меняют исходный аргумент.
Аналогия Вы даете кому-то ксерокопию документа. Изменения на копии не затрагивают оригинал. Вы даете кому-то ссылку на онлайн-документ. Изменения по ссылке меняют исходный файл.

А теперь главное, слушай сюда, в рот меня чих-пых: Java использует ТОЛЬКО передачу по значению. Да-да, ты не ослышался. Всё, что ты слышал про "передачу по ссылке для объектов" — это пиздёж собачий и заблуждение. Для ссылочных типов передаётся копия самой ссылки. Это как дать другу ксерокопию визитки с адресом твоего дома. Он может по этому адресу прийти и нахулиганить внутри (изменить состояние объекта), но саму визитку (ссылку) переписать с адресом другого дома он не может. Вот и вся магия, ёпта.

Контрольный пример на C++:

// Передача по ссылке в C++
void swap(int &x, int &y) { int temp = x; x = y; y = temp; }
int a = 5, b = 10;
swap(a, b); // Теперь a == 10, b == 5. Аргументы поменялись местами.

Видишь эту амперсандную поебень &? Это и есть настоящая передача по ссылке. Функция swap меняет оригинальные переменные a и b нахуй.

А теперь попробуй сделать такое же на Java для примитивов. Правильно, нихуя не выйдет! Потому что передаётся копия значения, и все твои манипуляции внутри функции останутся в ней, как вонь в общественном туалете. Это и есть железобетонное доказательство, что в Java передачи по ссылке — ноль ебать. Всё, можно расходиться.