Что произойдет, если внутри метода изменить саму ссылку на переданный объект?

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

Ответ

Изменение ссылочной переменной внутри метода не влияет на исходную ссылку в вызывающем коде. Это происходит потому, что Java передает параметры по значению (pass-by-value), то есть в метод передается копия ссылки, а не сама исходная ссылка.

Сценарий 1: Замена ссылки (изменение не видно снаружи)

public class ReferenceExample {
    static void replaceReference(List<String> list) {
        // 'list' - это локальная копия ссылки. Мы меняем её на новый объект.
        list = new ArrayList<>(); // Новая ссылка
        list.add("New Element");
        System.out.println("Inside method: " + list); // [New Element]
    }

    public static void main(String[] args) {
        List<String> originalList = new ArrayList<>();
        originalList.add("Original");
        replaceReference(originalList);
        // originalList по-прежнему ссылается на старый объект
        System.out.println("Outside method: " + originalList); // [Original]
    }
}

Сценарий 2: Изменение состояния объекта (изменение видно снаружи) Если использовать переданную копию ссылки для изменения внутреннего состояния объекта, эти изменения сохранятся, так как обе ссылки (оригинальная и копия) указывают на один и тот же объект в куче.

static void modifyContent(List<String> list) {
    // Используем копию ссылки для изменения общего объекта
    list.add("Modified Element");
    list.set(0, "Changed");
}

public static void main(String[] args) {
    List<String> originalList = new ArrayList<>(Arrays.asList("A", "B"));
    modifyContent(originalList);
    System.out.println(originalList); // [Changed, B, Modified Element]
}

Итог:

  • Переопределить ссылку в вызывающем коде из метода нельзя.
  • Изменить состояние объекта, на который эта ссылка указывает, можно, и это будет видно снаружи.