我将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);
}
}
答案 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 = !b1
是b1 = new Boolean(!b1.booleanValue)
的语法糖。因此,您不能修改作为参数发送到函数的原始对象,而是创建一个新的Boolean对象。