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
如何更改i的值,就像我更改arr的值一样?
答案 0 :(得分:15)
您无法在i
方法中更改main
中变量p1
的值,因为参数是按值传递的:参数{{1} } i
中的{}与p1
变量完全分开,只是它们在方法的开头具有相同的值。 Java 始终使用按值传递的语义 - 但是当参数类型是类时,它是通过值传递的引用。
事实上,你并没有改变i
的值 - 它是以前对同一个数组的引用,但 in 数组已经变了。这就是arr
可以做的事情,因为Integer
是一种不可变类型。
如果你想要一个像Integer
这样的可变类,你可以使用AtomicInteger
代替:
Integer
我通常不这样做,但是 - 我通常会尝试不修改方法参数引用的对象。相反,我编写计算单个结果的方法,然后返回。
答案 1 :(得分:3)
简单地说:你不能,因为Integer
是不可变的,你只能通过值得到对象地址,所以交换整个对象是不可能的,因为在方法完成后,旧对象被重新分配。 / p>
答案 2 :(得分:2)
您可以使用允许更改的AtomicInteger
代替Integer
:
public static void main(String[] args) {
AtomicInteger i = new AtomicInteger(0);
p1(i);
System.out.println(i);
}
public static void p1(AtomicInteger i) {
i.set(2);
}
答案 3 :(得分:0)
只能使用一些“黑客”。你可以这样做:
public static void p1(Integer curInt) {
Field field = curInt.getClass().getDeclaredField("value"); // Integer stores the real value in private field "value"
field.setAccessible(true);
field.set(curInt, 2);
}