3

在 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

4

4 回答 4

3

以下:

y=20;

重新绑定y以指向不同的Integer对象。

它不接触x,所以它的值不会改变。

于 2013-09-23T13:16:48.087 回答
1

每次在表单中看到代码

Integer x = 5;

编译器用类似的东西替换它

Integer x = Integer.valueOf(5);

这几乎类似于

Integer x = new Integer(5);

所以实际上,y = 20就是y = new Integer(20),所以 y 指针被重新定位以指向一个新创建的 Integer 对象。

于 2013-09-23T13:23:12.153 回答
1

第一行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 编程语言不通过引用传递对象;它按值传递对象引用。因为同一个引用的两个副本引用同一个实际对象,所以通过一个引用变量所做的更改通过另一个引用变量是可见的。

但是在您的情况下,您实际上并没有修改初始对象,而是将其引用之一更改为指向不同的对象。

于 2013-09-23T13:23:35.000 回答
0

Integer x = 5

上面的语句分配了一个存储值 5 并被 x 引用的内存空间;

Integer y = x

上面的语句将引用 y 指向与 x 相同的内存位置。

当您将值分配给 y = 20 时。这将创建一个新的内存空间,其中包含值 20 并由 y 引用。所以此时 x 和 y 都指向不同的内存位置。

于 2020-12-07T05:29:49.163 回答