Вопрос с собеседования · Java

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

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

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

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

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

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования