这个Java代码中,x = new int[2];是如何工作的?

6
分析以下代码:
class Test {

    public static void main(String[] args) {
        int[] x = {1, 2, 3, 4};
        int[] y = x;

        x = new int[2];
        for (int i = 0; i < y.length; i++) {
            System.out.print(y[i] + " ");
        }
    }
}
  • A. 程序显示1 2 3 4
  • B. 程序显示0 0
  • C. 程序显示0 0 3 4
  • D. 程序显示0 0 0 0

以下代码的答案是A。但为什么答案不是B?


1
xy引用 - Oliver Charlesworth
因为您正在打印值:{1,2,3,4}。答案怎么可能不是A呢? - Stultuske
因为在将x的初始值分配给y之后,您才更改了x的值,这意味着它不会影响当前y的值。因此,当您打印y时,它会打印与先前x值对应的值。 - shresha
1
我认为发帖文本比图片更好。 - akash
5个回答

9

假设{1, 2, 3, 4}的内存地址为M

x赋值给{1, 2, 3, 4},实际上是将{1, 2, 3, 4}的内存地址的引用赋值给了x,也就是说,x将指向M

当执行y = x时,y将引用M

之后,你更改了x所指向的引用,假设它现在指向了N

因此,当打印y时,y指向了M(即{1, 2, 3, 4}的地址),但是x持有N的引用(即new int[2])。这就是它们之间的区别。


4
为了给您更清晰的解释:
int[] x = {1, 2, 3, 4};       // step 1

enter image description here


int[] y = x;    // step 2

enter image description here


 x = new int[2];        // step 3

enter image description here


在第三步中,当x发生变化时,y不会受到影响,因为你改变的是x的引用而不是数组的地址。因此,它不会影响y的值。

1
答案肯定是A。我会逐步解释一下:
int[] x = {1, 2, 3, 4};
int[] y = x;

从上面的行中,我们现在知道x和y在值上相等,并且它们的长度为4。
x = new int[2];

我们现在已经改变了 x 的值,但是我们没有改变 y 的值。
所以现在 x 的长度为 2,即 {0, 0},而 y 的长度仍然为 4,即 {1, 2, 3, 4},这就是它们之间的区别...
for (int i = 0; i < y.length; i++)

在上面的代码行中,我们已经知道 y.length = 4,因此它是 i < 4
System.out.print(y[i] + " ");

上述代码将打印 y 数组中的值,分别为:

1

2

3

4


1
因为int[] y = x;,数组y将包含一些变量,如:{1,2,3,4}
这行代码x = new int[2];会为指向它的x创建一个不同的空间。
因此,数组y的结果将是{1,2,3,4}

1
因为您将 x 的值分配给了 y,而不是将 x 的引用赋给 y。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接