Метод принимает StringBuilder и внутри выполняет sb.append("x"), а затем sb = new StringBuilder(). Что увидит вызывающий код?
- Почему говорят, что Java всегда pass-by-value, если изменения объекта внутри метода видны снаружи?
Вызывающий увидит добавленный символ, но не новый объект: Java всегда передаёт по значению, а для ссылочных типов значение — копия ссылки. Мутация объекта по копии видна всем, переприсваивание копии — нет.
- «Объекты передаются по ссылке» — неточная формулировка
- Swap двух объектов через метод в Java невозможен
- Неизменяемые объекты (String, Integer) защищены от изменений внутри метода
А ещё Вернуть новый объект — через возвращаемое значение
Подробно
Формулировка «объекты передаются по ссылке» — самая живучая путаница в теме. На самом деле по значению передаётся всё, просто для ссылочных типов значением является сама ссылка. Копия ссылки указывает на тот же объект, поэтому вызовы, меняющие его состояние, видны снаружи. Присваивание же переставляет только локальную копию, и на переменную вызывающего это не влияет. Отсюда следствие: «вернуть значение через параметр» в Java невозможно — нужен возврат результата или объект-контейнер. Модификатор final у параметра запрещает переприсваивание внутри метода, но на семантику передачи не влияет.
Что хотят услышать
- Pass-by-value для ссылок.
- Разница мутации и переприсваивания.
Частые ошибки
- Говорить, что объекты в Java передаются по ссылке.
- Ожидать, что переприсваивание параметра изменит переменную вызывающего.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Ни того, ни другого: в метод передаётся копия самого объекта
- ✗И то и другое: в Java объекты передаются по ссылке
- ✗Поведение зависит от того, объявлен ли параметр метода как final
- ✓Увидит добавленный символ, но не переприсваивание
Что спросят дальше
- Почему нельзя написать метод swap для двух переменных?
- Что меняет final у параметра?
- Как тогда вернуть из метода два значения?
- Меняет ли что-то ключевое слово final у параметра?
Разбор темы
- Методы: pass-by-value, перегрузка, varargs
Почему Java всегда pass-by-value, разрешение перегрузки на этапе компиляции и устройство varargs.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.