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

«Передаются ли параметры в методы Java по ссылке или по значению?» — вопрос из категории Other, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Java все параметры передаются по значению (pass-by-value). Однако для объектных типов передается копия ссылки на объект, что создает иллюзию передачи по ссылке.

1. Передача объекта (копия ссылки):

void modifyList(List<String> listRef) { // listRef — копия ссылки из вызывающего кода
    listRef.add("new element"); // Изменяет состояние того же объекта
    listRef = null; // Обнуляет только локальную копию ссылки, оригинал не меняется
}

List<String> myList = new ArrayList<>();
modifyList(myList);
System.out.println(myList); // Вывод: [new element]

2. Передача примитива (копия значения):

void modifyPrimitive(int x) { // x — копия значения
    x = 10; // Изменяется только локальная копия
}

int num = 5;
modifyPrimitive(num);
System.out.println(num); // Вывод: 5 (оригинал не изменился)

Итог: Механизм всегда один — pass-by-value. Для объектов это означает, что метод получает копию ссылки и может менять состояние объекта, но не может заменить сам объект, на который ссылается исходная переменная.