Получить доступ

Метод принимает StringBuilder и внутри выполняет sb.append("x"), а затем sb = new StringBuilder(). Что увидит вызывающий код?

MiddleОсновы языка
Ещё спрашивают так:
  • Почему говорят, что Java всегда pass-by-value, если изменения объекта внутри метода видны снаружи?
Коротко

Вызывающий увидит добавленный символ, но не новый объект: Java всегда передаёт по значению, а для ссылочных типов значение — копия ссылки. Мутация объекта по копии видна всем, переприсваивание копии — нет.

  • «Объекты передаются по ссылке» — неточная формулировка
  • Swap двух объектов через метод в Java невозможен
  • Неизменяемые объекты (String, Integer) защищены от изменений внутри метода

А ещё Вернуть новый объект — через возвращаемое значение

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Формулировка «объекты передаются по ссылке» — самая живучая путаница в теме. На самом деле по значению передаётся всё, просто для ссылочных типов значением является сама ссылка. Копия ссылки указывает на тот же объект, поэтому вызовы, меняющие его состояние, видны снаружи. Присваивание же переставляет только локальную копию, и на переменную вызывающего это не влияет. Отсюда следствие: «вернуть значение через параметр» в Java невозможно — нужен возврат результата или объект-контейнер. Модификатор final у параметра запрещает переприсваивание внутри метода, но на семантику передачи не влияет.

Что хотят услышать

  • Pass-by-value для ссылок.
  • Разница мутации и переприсваивания.

Частые ошибки

  • Говорить, что объекты в Java передаются по ссылке.
  • Ожидать, что переприсваивание параметра изменит переменную вызывающего.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Добавленный символ увидит, а переприсваивание — нет: копируется ссылка, а не сам объект
  • ✗Ни того, ни другого: объект передаётся копией
  • ✗И то и другое: объекты передаются по ссылке
  • ✗Поведение зависит от того, объявлен ли параметр final

Что спросят дальше

  • Почему нельзя написать метод swap для двух переменных?
  • Что меняет final у параметра?
  • Как тогда вернуть из метода два значения?
  • Меняет ли что-то ключевое слово final у параметра?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем