Java всегда передаёт аргументы по значению: для объекта копируется ссылка. После doIt переменная a указывает на объект №1, instanceNumber = 1, x = 12, y = 22, z = 3.
Разбор передачи аргументов в Java‑метод
Java всегда передаёт аргументы по значению: для объекта копируется ссылка. После doIt переменная a указывает на объект №1, instanceNumber = 1, x = 12, y = 22, z = 3.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Перепишите код, учитывая особенности передачи параметров по значению и по ссылке. Опишите, что происходит, когда переменные z и a передаются в метод doIt(). Какие значения будут у a, a.instanceNumber, a.x, a.y и z после завершения метода? Каково действие строки a = new A(2); внутри метода и почему оно ведёт себя именно так?
public class A {
private static int y;
private final int instanceNumber;
private int x;
public A(int instanceNumber) {
this.instanceNumber = instanceNumber;
}
public String toString() {
return String.valueOf(instanceNumber);
}
private static void doIt(int i, A a) {
i = 11;
a.x = 12;
y = 13;
a = new A(2); // ?
a.x = 21;
y = 22;
}
public static void main(String[] args) {
A a = new A(1); // 1
a.x = 1;
y = 2;
int z = 3;
A.doIt(z, a);
}
}
Ответ
Java всегда передаёт аргументы по значению: для объекта копируется ссылка. После doIt переменная a указывает на объект №1, instanceNumber = 1, x = 12, y = 22, z = 3.
Локальное i = 11 не меняет z. Первое a.x = 12 меняет общий объект, но a = new A(2) перенаправляет только параметр метода: переменная main не затрагивается. Затем x = 21 записывается во второй объект, а статическое y = 22 видно через весь класс. Если нужно заменить объект у вызывающего кода, верните новый A из метода и явно присвойте результат a.