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

Ответ

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

Что это значит на практике:

  1. Для примитивных типов (int, double, boolean, char и др.) в метод передается копия самого значения. Изменение параметра внутри метода не влияет на оригинальную переменную.
  2. Для ссылочных типов (объекты, массивы) в метод передается копия ссылки (адреса объекта в памяти). Через эту копию можно изменять состояние объекта, но нельзя изменить саму оригинальную ссылку (например, присвоить ей новый объект).

Пример 1: Примитивный тип (передача копии значения)

void modifyPrimitive(int x) {
    x = 100; // Меняем локальную копию
    System.out.println("Inside method: x = " + x); // 100
}

public static void main(String[] args) {
    int number = 5;
    modifyPrimitive(number);
    System.out.println("After method: number = " + number); // 5 (не изменилось)
}

Пример 2: Ссылочный тип (передача копии ссылки)

class MyObject {
    String value;
}

void modifyReference(MyObject obj) {
    obj.value = "Changed"; // Меняем состояние объекта по копии ссылки
    obj = new MyObject();   // Переназначаем локальную копию ссылки на новый объект
    obj.value = "New";
}

public static void main(String[] args) {
    MyObject original = new MyObject();
    original.value = "Original";
    modifyReference(original);
    System.out.println(original.value); // "Changed" (состояние изменилось!)
    // Но сама переменная `original` по-прежнему ссылается на старый объект.
}

Итог:

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

Ответ 18+ 🔞

А, слушай, смотри, тут такая тема, про которую новички постоянно ебут мозг друг другу и сами себе. В Java, блядь, все параметры в методы передаются строго по значению (pass-by-value). Передачи по ссылке (pass-by-reference) тут, нахуй, нет и не было. Это как аксиома, прими и не спорь, иначе пиздец.

Что это значит на практике, для нас, простых смертных:

  1. Примитивы (int, boolean и прочая хуйня): В метод летит копия циферки или булевки. Поменял внутри — ну, поменял свою копию. Оригиналу на это похуй, он как был, так и остался.
  2. Объекты и массивы (ссылочные типы): Тут хитрее, блядь. Передаётся копия ссылки (адреса этой хрени в памяти). По этой копии ты можешь лезть внутрь объекта и менять там всё, что захочешь. Но! Саму оригинальную ссылку (то есть переменную снаружи) ты переприсвоить не сможешь. Это как дали тебе дубликат ключа от квартиры: мебель внутри передвинуть — пожалуйста, а вот поменять замок и сказать, что теперь ключ открывает другую квартиру — хуй ты, это ж копия ключа, а не сам ключ.

Пример 1: Примитив (копия значения, всё просто)

void modifyPrimitive(int x) {
    x = 100; // Меняем свою локальную копию
    System.out.println("Inside method: x = " + x); // 100
}

public static void main(String[] args) {
    int number = 5;
    modifyPrimitive(number);
    System.out.println("After method: number = " + number); // 5 (оригинал не тронут, ёпта!)
}

Пример 2: Объект (копия ссылки, тут веселее)

class MyObject {
    String value;
}

void modifyReference(MyObject obj) {
    obj.value = "Changed"; // А вот это работает! Лезу по копии ссылки внутрь и меняю состояние.
    obj = new MyObject();   // А вот это нихуя не работает снаружи! Переназначил свою локальную копию ссылки.
    obj.value = "New";      // Работает только внутри метода для нового объекта.
}

public static void main(String[] args) {
    MyObject original = new MyObject();
    original.value = "Original";
    modifyReference(original);
    System.out.println(original.value); // Будет "Changed"! Состояние-то поменяли!
    // Но сама переменная `original` всё ещё тыкает в тот же старый объект, а не в новый.
}

Итог, блядь:

  • Поменять саму ссылку (куда смотрит внешняя переменная) из метода — нельзя, нахуй.
  • Изменить содержимое объекта, на который эта ссылка указывает — можно, запросто.
  • Вот это всё умные дяди называют "передача ссылки по значению". Звучит как пиздопроебибна, но если вникнуть — логично, ёпта.