Ответ
В Java все параметры передаются строго по значению (pass-by-value). Это фундаментальное правило языка.
- Для примитивных типов (int, boolean, double и т.д.) в метод передается копия самого значения. Изменение параметра внутри метода не влияет на исходную переменную.
- Для ссылочных типов (объекты, массивы) в метод передается копия ссылки на объект. Это создает две ссылки (оригинальная и параметр), указывающие на один и тот же объект в куче.
Ключевое различие:
- Состояние объекта можно изменить через скопированную ссылку.
- Саму исходную ссылку изменить нельзя — переназначение параметра на новый объект внутри метода не затрагивает исходную переменную.
Пример, демонстрирующий оба случая:
public class ParameterPassingDemo {
static void modify(ObjectRef ref) {
ref.value = 20; // (1) Меняет состояние объекта — изменение видно снаружи.
ref = new ObjectRef(30); // (2) Переназначает локальную копию ссылки — снаружи не видно.
}
public static void main(String[] args) {
ObjectRef myRef = new ObjectRef(10);
modify(myRef);
System.out.println(myRef.value); // Выведет 20, а не 10 или 30.
}
}
class ObjectRef { int value; ObjectRef(int v) { this.value = v; } }
Термин "передача по ссылке" в контексте Java является некорректным и ведет к путанице.
Ответ 18+ 🔞
Да, блядь, вот эта тема — классика, на которой все мозги себе ебут! Каждый второй джуниор, как услышит «в Java всё передаётся по значению», сразу начинает нести хуйню про «как же так, я же объект в методе поменял, он изменился, значит передача по ссылке!». Нет, сука, не значит!
Слушай сюда, распишу как для дебила, но с технической точностью, чтоб ты потом не позорился на собеседовании.
Примитивы (int, boolean и прочая мелочь) Тут всё просто, как три копейки. В метод летит копия значения. Внутри метода ты можешь этот параметр хоть наизнанку вывернуть — исходной переменной на улице похуй. Она своё значение не поменяет. Это как сфоткать бумажку с числом, на фотке зачеркнуть и написать другое, а оригинал так и лежит нетронутый.
Ссылочные типы (объекты, массивы) А вот тут начинается магия и пиздец, где все путаются. В метод передаётся копия ссылки (адреса в памяти), а не сам объект. Представь: у тебя есть пульт от телевизора (это переменная). Ты делаешь его копию (это параметр метода) и отдаёшь другу.
Что можно сделать с копией пульта?
- Менять каналы и громкость на том же самом телевизоре — это
ref.value = 20. Действие происходит с оригинальным объектом в куче, поэтому изменения видны всем, у кого есть ссылка на этот телевизор. Вот отсюда и растут ноги у мифа о «передаче по ссылке». - Выбросить свою копию пульта и начать тыкать в другой, новый телевизор — это
ref = new ObjectRef(30). Ты переназначил свою локальную копию ссылки. А оригинальный пульт у того, кто вызывал метод, остался нетронутым и по-прежнему смотрит свой старый ящик. Поэтому снаружи нихуя не изменилось.
Вот тебе живой пример, чтоб в голове окончательно прояснилось:
public class ParameterPassingDemo {
static void modify(ObjectRef ref) {
ref.value = 20; // (1) Идём по скопированной ссылке и крутим ручки у ОРИГИНАЛЬНОГО объекта. Всё меняется.
ref = new ObjectRef(30); // (2) Говорим: «Эта локальная копия ссылки теперь указывает на НОВЫЙ объект». На оригинальную переменную myRef это НИКАК не влияет.
}
public static void main(String[] args) {
ObjectRef myRef = new ObjectRef(10);
modify(myRef);
System.out.println(myRef.value); // Выведет 20, ёпта! Потому что пункт (1) сработал, а пункт (2) — это локальный пиздец внутри метода.
}
}
class ObjectRef { int value; ObjectRef(int v) { this.value = v; } }
Так что запомни раз и нахуй: в Java нет передачи по ссылке (pass-by-reference). Есть только передача по значению (pass-by-value), где значением для объектов является копия ссылки. Кто говорит иначе — тот, извини, пидарас шерстяной, не понимающий базовых механизмов языка. Всё, вопрос закрыт.