public static void main(String[] args) {
Integer i = new Integer(0);
int[] arr = {1};
p1(i);
p2(arr);
System.out.println(i);
System.out.println(arr[0]);
}
public static void p1(Integer i) {
i = 2;
}
public static void p2(int[] i) {
i[0] = 2;
}
//输出:0, 2
如何像改变arr的值一样改变i的值?
您不能从 p1
方法中更改 main
中变量 i
的值,因为参数是按值传递的: p1
中的参数i
完全独立于i
变量,只是它们在方法开始时具有相同的值。 Java 总是 使用按值传递语义 - 但当参数类型是类时,它是按值传递的引用。
事实上,您也没有更改 arr
的值 - 它是对与以前相同的数组的引用,但是数组中的值已经变了。而这正是 Integer
无法做到的,因为 Integer
是一种不可变类型。
如果你想要一个像Integer
这样的可变类,你可以使用AtomicInteger
相反:
public static void main(String[] args) {
AtomicInteger i = new AtomicInteger(0);
modify(i);
System.out.println(i);
}
private static void modify(AtomicInteger x) {
x.set(2);
}
我通常不会这样做,但是 - 我通常尽量不修改方法参数引用的对象。相反,我编写了计算单个结果并返回该结果的方法。