根据这个答案https://stackoverflow.com/a/12020435/562222,将对象分配给另一个只是复制引用,但让我们看一下这段代码:
public class TestJava {
public static void main(String[] args) throws IOException {
{
Integer x;
Integer y = 223432;
x = y;
x += 23;
System.out.println(x);
System.out.println(y);
}
{
Integer[] x;
Integer[] y = {1,2, 3, 4, 5};
x = y;
x[0] += 10;
printArray(x);
printArray(y);
}
}
public static <T> void printArray(T[] inputArray) {
for(T element : inputArray) {
System.out.printf("%s ", element);
}
System.out.println();
}
}
运行它给出:
223455
223432
11 2 3 4 5
11 2 3 4 5
答案 0 :(得分:4)
行为是一致的。这一行:
x += 23;
实际上为Integer
分配了不同的x
对象;它不会在该语句之前修改x
表示的值(事实上,它与对象y
相同)。在幕后,编译器将取消装箱x
,然后装入添加23的结果,就像编写代码一样:
x = Integer.valueOf(x.intValue() + 23);
如果检查编译时生成的字节码(在编译后运行javap -c TestJava
),就可以看到这一点。
第二部分中的内容是这一行:
x[0] += 10;
还会为x[0]
分配一个新对象。但由于x
和y
引用相同的数组,因此也会将y[0]
更改为新对象。
答案 1 :(得分:1)
Integer
是不可变的,因此一旦创建就无法修改其状态。当你这样做时:
Integer x;
Integer y = 223432;
x = y;
x += 23;
行x += 23
正在为Integer
变量分配新的x
值。
数组是可变的,所以当你改变数组的状态时,例如更改数组中的一个元素,另一个是受影响的。
答案 2 :(得分:0)
执行此操作x += 23;
时,实际创建了另一个对象,并在此新对象上创建了x点。因此,x和y是两个不同的对象。