Почему в Java изменения примитивного типа внутри метода не видны снаружи?

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

Ответ

В Java все параметры в методы передаются по значению (pass-by-value). Для примитивных типов (int, boolean, double и т.д.) передаётся копия самого значения.

Механика:

  1. При вызове метода создаётся локальная копия переменной-аргумента.
  2. Все операции внутри метода выполняются с этой копией.
  3. После завершения метода копия уничтожается, а исходная переменная остаётся неизменной.

Пример:

public class PrimitiveExample {
    static void modify(int x) {
        x = x + 10; // Меняется локальная копия 'x'
        System.out.println("Inside method: x = " + x); // Вывод: 15
    }

    public static void main(String[] args) {
        int original = 5;
        modify(original);
        System.out.println("After method: original = " + original); // Вывод: 5
    }
}

Как передать изменение наружу?

  1. Возврат значения:
    int increment(int x) {
        return x + 1;
    }
    original = increment(original);
  2. Использование mutable-обёртки:
    void modify(AtomicInteger x) {
        x.incrementAndGet(); // Изменяет состояние объекта
    }
    // AtomicInteger — это объект, передаётся копия ссылки на него
  3. Завернуть в свой объект (но это уже ссылочный тип):
    class Holder { int value; }
    void modify(Holder h) { h.value = 10; }

Ключевое отличие для ссылочных типов: Передаётся копия ссылки на объект. Через эту копию можно изменить состояние объекта, но нельзя переприсвоить саму исходную ссылку.