通过包装在原始类的类中传递原始类型作为引用传递

时间:2014-12-25 02:12:00

标签: java pass-by-reference pass-by-value

我将2个布尔对象传递给函数。我知道Java是按值传递的,但由于我使用对象作为参数,它应该传递这些参数的地址而不是值。但在更新函数中的对象值后,我没有在main中看到更新的值。我在这里缺少什么?

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);
    }
}

3 个答案:

答案 0 :(得分:4)

包装器类型是不可变的,因此您在那里创建新的(本地)引用。对于您期望的行为,您可以传递一个数组(请注意,数组是Java中的Object个实例)。

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。因此,在您的情况下,它通过引用传递,并且值保持不变,因为它们的性质是不可变的。

答案 2 :(得分:0)

b1 = !b1b1 = new Boolean(!b1.booleanValue)的语法糖。因此,您不能修改作为参数发送到函数的原始对象,而是创建一个新的Boolean对象。