gpt4 book ai didi

Java对象赋值行为不一致?

转载 作者:行者123 更新时间:2023-12-01 17:02:30 25 4
gpt4 key购买 nike

根据这个答案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]。但由于 xy 引用同一个数组,这也会将 y[0] 更改为新对象。

关于Java对象赋值行为不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26789940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com