Как в Java передаются параметры в методы: по ссылке или по значению?

Ответ

В Java все параметры передаются строго по значению (pass-by-value). Это фундаментальное правило языка.

  • Для примитивных типов (int, boolean, double и т.д.) в метод передается копия самого значения. Изменение параметра внутри метода не влияет на исходную переменную.
  • Для ссылочных типов (объекты, массивы) в метод передается копия ссылки на объект. Это создает две ссылки (оригинальная и параметр), указывающие на один и тот же объект в куче.

Ключевое различие:

  1. Состояние объекта можно изменить через скопированную ссылку.
  2. Саму исходную ссылку изменить нельзя — переназначение параметра на новый объект внутри метода не затрагивает исходную переменную.

Пример, демонстрирующий оба случая:

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 и прочая мелочь) Тут всё просто, как три копейки. В метод летит копия значения. Внутри метода ты можешь этот параметр хоть наизнанку вывернуть — исходной переменной на улице похуй. Она своё значение не поменяет. Это как сфоткать бумажку с числом, на фотке зачеркнуть и написать другое, а оригинал так и лежит нетронутый.

Ссылочные типы (объекты, массивы) А вот тут начинается магия и пиздец, где все путаются. В метод передаётся копия ссылки (адреса в памяти), а не сам объект. Представь: у тебя есть пульт от телевизора (это переменная). Ты делаешь его копию (это параметр метода) и отдаёшь другу.

Что можно сделать с копией пульта?

  1. Менять каналы и громкость на том же самом телевизоре — это ref.value = 20. Действие происходит с оригинальным объектом в куче, поэтому изменения видны всем, у кого есть ссылка на этот телевизор. Вот отсюда и растут ноги у мифа о «передаче по ссылке».
  2. Выбросить свою копию пульта и начать тыкать в другой, новый телевизор — это 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), где значением для объектов является копия ссылки. Кто говорит иначе — тот, извини, пидарас шерстяной, не понимающий базовых механизмов языка. Всё, вопрос закрыт.