在 Java 中,我们可以使用包装类来声明变量。例如
Integer x=5;
这意味着有一个指向值 5 的引用“x”。
然后我声明了另一个名为 y 的引用,它指向相同的值
Integer y=x; //now y should point to the number "5"
然后我改变了 y 指向的值
y=20;
这不会使 x 和 y 都指向 20 吗?因为当我打印 x 时,我仍然得到 5
以下:
y=20;
重新绑定y
以指向不同的Integer
对象。
它不接触x
,所以它的值不会改变。
每次在表单中看到代码
Integer x = 5;
编译器用类似的东西替换它
Integer x = Integer.valueOf(5);
这几乎类似于
Integer x = new Integer(5);
所以实际上,y = 20
就是y = new Integer(20)
,所以 y 指针被重新定位以指向一个新创建的 Integer 对象。
第一行Integer x=5;
x
是对值为 5 的 Integer 对象的引用。然后Integer y=x;
为同一个对象创建另一个引用,因此x
引用y
同一个对象。最后,y=20;
使引用y
指向一个不同的对象,一个Integer
值为 20 的对象。
摘自 Ken Arnold、James Gosling 和 David Holmes 的“Java 编程语言,第 4 版”:
Java 编程语言不通过引用传递对象;它按值传递对象引用。因为同一个引用的两个副本引用同一个实际对象,所以通过一个引用变量所做的更改通过另一个引用变量是可见的。
但是在您的情况下,您实际上并没有修改初始对象,而是将其引用之一更改为指向不同的对象。
Integer x = 5
上面的语句分配了一个存储值 5 并被 x 引用的内存空间;
Integer y = x
上面的语句将引用 y 指向与 x 相同的内存位置。
当您将值分配给 y = 20 时。这将创建一个新的内存空间,其中包含值 20 并由 y 引用。所以此时 x 和 y 都指向不同的内存位置。