В этом коде происходит следующее:
// 3
В этом коде происходит следующее:
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
// 3 public class Variables { public static void main(String[] args) { A a = new A(); a.val = 1; inc(a); System.out.println(a.val); set(a); System.out.println(a.val); }
public static class A {
public int val;
}
public static void inc(A a) {
a.val++;
}
public static void set(A a) {
a = new A();
a.val = 10;
}
}
Ответ
В этом коде происходит следующее:
- Создаётся объект
A a = new A();с полемval. a.valустанавливается в 1.- Вызывается метод
inc(a), который увеличиваетa.valна 1. Теперьa.valравно 2. - Печатается
a.val— вывод будет2. - Вызывается метод
set(a), в котором параметрaлокально переназначается на новый объектnew A()сval = 10. Однако это не влияет на объект вне метода, так как параметр передаётся по ссылке на объект, но сама ссылка копируется. - Печатается
a.val— вывод будет всё ещё2.
Итоговый вывод:
2
2
Объяснение:
- В Java объекты передаются в методы по значению ссылки. То есть копируется ссылка на объект.
- В методе
incизменяется поле объекта, на который ссылаетсяa, поэтому изменения видны вне метода. - В методе
setссылкаaпереназначается на новый объект, но это локальное изменение ссылки, не влияющее на оригинальный объект вне метода.