[英]Java object assignment behaviour not consistent?
根据这个答案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
行为是一致的。 这行:
x += 23;
实际上为x
分配了一个不同的Integer
对象; 它不会修改该语句之前的x
表示的值(实际上与对象y
相同)。 在幕后,编译器将x
拆箱,然后将加23的结果装箱,就像编写代码一样:
x = Integer.valueOf(x.intValue() + 23);
如果检查编译时生成的字节码(在编译后仅运行javap -c TestJava
),就可以确切地看到这一点。
第二部分中的内容是这一行:
x[0] += 10;
还为x[0]
分配了一个新对象。 但是由于x
和y
引用相同的数组,因此这也将y[0]
更改为新对象。
Integer
是不可变的,因此一旦创建,便无法修改其状态。 执行此操作时:
Integer x;
Integer y = 223432;
x = y;
x += 23;
x += 23
行将新的Integer
值分配给x
变量。
另一方面,数组是可变的,因此当您更改数组的状态(例如,更改数组中的一个元素)时,另一个也会受到影响 。
当你这样做x += 23;
,您实际上创建了另一个对象,并在此新对象上使x指向了x。 因此,x和y是2个不同的对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.