Что означает передача параметров по значению в Java?

Ответ

Передача по значению (pass-by-value) — это единственный механизм передачи аргументов в методы Java. Он означает, что в момент вызова метода вычисляется значение аргумента, и именно эта копия значения передается в параметр метода.

Поведение для разных типов:

  • Примитивные типы: Передается копия фактического числа, символа или логического значения.
    void change(int x) { x = 100; }
    int a = 5;
    change(a);
    System.out.println(a); // 5. Значение 'a' не изменилось.
  • Ссылочные типы: Передается копия значения ссылки (адреса объекта в памяти), а не копия самого объекта.

    void addToList(List<String> list) { list.add("New"); }
    void reassignList(List<String> list) { list = new ArrayList<>(); }
    
    List<String> myList = new ArrayList<>();
    addToList(myList);     // myList теперь содержит "New".
    reassignList(myList);  // myList всё ещё указывает на исходный список.

    Итог: Метод работает с локальной копией. Он может модифицировать состояние объекта, на который указывает скопированная ссылка, но не может изменить исходную переменную-аргумент, заставив её ссылаться на другой объект.

Ответ 18+ 🔞

А, слушай, вот этот ваш вечный спор про "передачу по значению" в Java — это же классика, блядь! Все как будто в первый раз слышат и начинают нести хуйню несусветную. Ёпта, давайте раз и навсегда разжуем, как для дебилов, только без дебилизма.

Вот смотри. Представь, что у тебя есть бумажка с номером квартиры. Это твоя переменная. Так вот, Java — она жадная сука, она никогда не отдаст тебе саму квартиру (объект) или даже оригинальную бумажку с номером (ссылку). Она, хитрая жопа, берет ксерокс, блядь, и делает КОПИЮ этой бумажки. И вот эту ебучую копию она и сует в метод. Весь механизм — pass-by-value, то есть "передача ЗНАЧЕНИЯ". Значения бумажки, ага. Всё. Точка.

Теперь, внимание, ебаный рот, на два случая:

Случай первый: примитивы (int, boolean и прочая мелочь). Тут всё просто, как три копейки. Значение — это само число. Скопировали пятерку, отдали. Метод получил свою собственную, отдельную пятерку и может делать с ней что хочет — исходная переменная и не обоснётся.

void поменяйЧисло(int x) { x = 100; } // x — это локальная копия, её и меняем

int моёЧисло = 5;
поменяйЧисло(моёЧисло);
System.out.println(моёЧисло); // Выведет 5, ебать. Потому что меняли копию, а не оригинал.

Случай второй: ссылочные типы (все эти твои List, Object и прочий хлам). А вот тут начинается магия, или, как я это называю, "пиздец головного мозга для новичков". Значение ссылочной переменной — это НЕ ОБЪЕКТ, блядь! Это АДРЕС объекта, та самая бумажка с номером квартиры. Копируется именно этот адрес, эта бумажка! Сам объект так и остаётся в памяти на своём месте, его никто не клонирует.

И вот что получается:

  1. Меняем состояние объекта (заходим в квартиру и движем мебель). Да запросто! У нас же есть копия бумажки с тем же номером. Мы по этому адресу пришли и навели внутри свой порядок. Исходная переменная (у которой оригинальная бумажка) всё ещё указывает на ту же квартиру и видит весь этот бардак.

    void добавьВСписок(List<String> список) { список.add("Новый"); } // Зашли в квартиру по копии адреса и поставили новый диван
    
    List<String> мойСписок = new ArrayList<>();
    добавьВСписок(мойСписок);     // мойСписок теперь содержит "Новый". Объект изменился!
  2. Пытаемся переназначить ссылку (выбросить копию бумажки и взять адрес другой квартиры). А вот это нихуя не выйдет! Метод работает со своей локальной копией бумажки. Он может её порвать, написать на ней новый адрес, но это никак не повлияет на оригинальную бумажку, которая осталась у вызывающего кода.

    void перепривяжиСписок(List<String> список) { список = new ArrayList<>(); } // Выбросили копию адреса и взяли новый
    
    List<String> мойСписок = new ArrayList<>();
    перепривяжиСписок(мойСписок);  // мойСписок как указывал на старую квартиру, так и указывает. Мы меняли только свою копию бумажки!

Итог, блядь, итог! Java всегда передаёт КОПИЮ ЗНАЧЕНИЯ. Для примитивов — копию числа. Для ссылок — копию адреса. Поэтому метод:

  • Может (имея копию адреса) навести пиздец внутри объекта (потому что объект один).
  • Не может заставить исходную переменную смотреть на другой объект (потому что менял свою копию, а не оригинальную ссылку).

Всё, я устал. Иди теперь думай. Э, бошка, работай!