Я передаю 2 Boolean объектов функции. Я знаю, что Java передается по значению, но поскольку я использую объекты в качестве параметров, он должен передавать адрес этих параметров вместо значения. Но после обновления значений объектов в функции я не вижу обновленных значений в основном. Что мне здесь не хватает?
public class Test1 {
public static void main(String[] args){
Boolean b1 = new Boolean(false);
Boolean b2 = new Boolean(false);
System.out.println(b1+" "+b2);
func1(b1, b2);
System.out.println(b1+" "+b2);
}
static void func1(Boolean b1, Boolean b2){
System.out.println(b1+" "+b2);
b1 = !b1;
b2 = !b2;
System.out.println(b1+" "+b2);
}
}
Типы обертки неизменяемы, поэтому вы создаете там новые (локальные) ссылки. Для поведения, которое вы ожидаете, вы можете передать массив (обратите внимание, что массивы являются экземплярами Object
в Java).
public static void main(String[] args) {
boolean[] arr = { true, false };
System.out.println(arr[0] + " " + arr[1]);
func1(arr);
System.out.println(arr[0] + " " + arr[1]);
}
static void func1(boolean[] arr) {
System.out.println(arr[0] + " " + arr[1]);
arr[0] = !arr[0];
arr[1] = !arr[1];
System.out.println(arr[0] + " " + arr[1]);
}
Выход
true false
true false
false true
false true
Все в java проходит по значению. Вы передаете объекты, которые относятся к типу обертки класса, эти объекты неизменяемы, то есть их значение фиксировано. Поскольку объекты передаются как параметр, который является своего рода ссылками, он называется pass by reference. Таким образом, в вашем случае он проходит по ссылке, и значение остается неизменным из-за их природы, которая неизменна.
b1 = !b1
- синтаксический сахар для b1 = new Boolean(!b1.booleanValue)
. Из-за этого вы не изменяете исходный объект, который был отправлен как параметр функции, но вместо этого создайте новый объект Boolean.