Передача примитивного типа как передача по ссылке путем переноса в класс примитивного типа

1

Я передаю 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);
    }
}
Теги:
pass-by-value
pass-by-reference

3 ответа

4

Типы обертки неизменяемы, поэтому вы создаете там новые (локальные) ссылки. Для поведения, которое вы ожидаете, вы можете передать массив (обратите внимание, что массивы являются экземплярами 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
  • 1
    спасибо @ Эллиотт Фриш
1

Все в java проходит по значению. Вы передаете объекты, которые относятся к типу обертки класса, эти объекты неизменяемы, то есть их значение фиксировано. Поскольку объекты передаются как параметр, который является своего рода ссылками, он называется pass by reference. Таким образом, в вашем случае он проходит по ссылке, и значение остается неизменным из-за их природы, которая неизменна.

0

b1 = !b1 - синтаксический сахар для b1 = new Boolean(!b1.booleanValue). Из-за этого вы не изменяете исходный объект, который был отправлен как параметр функции, но вместо этого создайте новый объект Boolean.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню