当它是像变量数组的值这样的参数时,如何更改Integer值?

时间:2014-10-03 19:29:24

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

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的值一样?

4 个答案:

答案 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);

}