2014-12-25 39 views
1

我将2个布尔对象传递给一个函数。我知道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); 
    } 
} 

回答

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

谢谢@Elliott Frisch – alchemist

0

b1 = !b1为​​语法糖。因此,您不会修改作为参数发送给函数的原始对象,而是会创建一个新的布尔对象。

1

java中的所有东西都是按值传递的。你传递的是包装类的对象,这些对象是不可变的,也就是说,它们的值是固定的。由于对象是作为某种引用的参数传递的,因此称为传递引用。所以在你的情况下,它是通过引用传递的,并且价值保持不变,因为它们的性质是不变的。