Если вызвать a(x), программа напечатает x в методе d, а затем x в методе a. Присваивание item = 20L меняет только локальный параметр d: long передаётся по значению.
public static void a(long item) {
Если вызвать a(x), программа напечатает x в методе d, а затем x в методе a. Присваивание item = 20L меняет только локальный параметр d: long передаётся по значению.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
public static void a(long item) { b(item); System.out.println(item); }
public static void b(long item) { c(item); }
public static void c(long item) { d(item); }
public static void d(long item) { System.out.println(item); item = 20L; // тут }
Ответ
Если вызвать a(x), программа напечатает x в методе d, а затем x в методе a. Присваивание item = 20L меняет только локальный параметр d: long передаётся по значению.
Каждый вызов получает собственную копию числа. В точке комментария у d значение item равно 20, но параметры a, b и c сохраняют исходное x. Например, a(7L) выводит две строки 7. Сам фрагмент объявляет методы и без вызова ничего не печатает. Чтобы новое значение дошло до a, его нужно вернуть по цепочке либо явно менять разделяемый объект, если это оправдано контрактом.