以下是我的代码:
class Demo{
public static void main(String[] args) {
Integer i = new Integer(12);
System.out.println(i);
modify(i);
System.out.println(i);
}
private static void modify(Integer i) {
i= i + 1;
System.out.println(i);
}
}
上述代码的输出是 12 12 但据我所知,我们传递包装器对象“i”,这意味着它应该是“按引用调用”,然后值应该更改为13.但是它的12。 有人对此有正确的解释吗?
答案 0 :(得分:8)
引用按值传递,除此之外,整数为immutable。
将i
传递给方法modify
时,传递引用的值(引用是该方法的本地引用),当您为其分配另一个对象时,只修改该本地引用/变量持有参考。原件保持不变。
不可变意味着一旦创建/实例化了一个对象,就不可能再改变它的状态了。
答案 1 :(得分:3)
modify
方法中的这行代码:
i= i + 1;
正在使用Integer
,而不是int
。它执行以下操作:
i
为int值Integer
对象Integer
分配给i
(从而更改对象i
引用)由于对象引用是按值传递的,因此modify
方法中的操作不会更改在modify
调用中用作参数的变量。因此,在方法返回后,主例程仍然会打印12
。
如果你想改变对象本身,你必须传递一个可变对象(正如其他人所提到的,Integer
是不可变的),你必须调用mutator方法或直接修改字段。例如:
class Demo{
static class IntHolder {
private int value;
public IntHolder(int i) {
value = i;
}
public IntHolder add(int i) {
value += i;
return this;
}
public String toString() {
return String.valueOf(value);
}
}
public static void main(String[] args) {
IntHolder i = new IntHolder(12);
System.out.println(i);
modify(i);
System.out.println(i);
}
private static void modify(IntHolder i) {
i.add(1);
System.out.println(i);
}
}
答案 2 :(得分:1)
包装类是不可变的,因此加法和减法等操作会创建一个新对象,而不是修改旧对象。
如果要通过引用传递基元,一种方法是传递单个元素数组:
int[] i= new int[1]{12};
...
private static void modify(int[] i) {
i[0]= i[0] + 1;
System.out.println(i[0]);
}
答案 3 :(得分:0)
Java始终是按值传递的。困难的是可以理解Java将对象作为引用传递,并且这些引用是按值传递的。
检查出来:
答案 4 :(得分:0)
检查我的eclipse它给出输出12 13 12.修改方法按值传递12然后i= i + 1;
它添加一个。
package com.demo.swain;
public class Demo {
public static void main(String[] args) {
Integer i = new Integer(12);
System.out.println(i);
modify(i);
System.out.println(i);
}
private static void modify(Integer i) {
i= i + 1;
System.out.println(i);
}
}
Output:12
13
12
我强烈说这段代码不给出输出12,12。