变量被覆盖

时间:2015-06-08 02:12:08

标签: java variables

我有一段代码给了我意想不到的输出。我相信这与存储空间有关,正如我在下面的输出中所描述的那样。但我不确定。

代码:

    public static void main(String[] args) {

        int [] x = {1,2};
        int [] y = plusOne(x);
        System.out.println(x[0] + " " + x[1]);
        System.out.println(y[0] + " " + y[1]);
    }

    public static int [] plusOne(int [] x) {
        System.out.println("x :"+ x);
        int [] y = x;//1 2

        x = new int [x.length];
        System.out.println("y: "+y);
        for (int i=0; i<y.length;i++){
            x[i] = y[i];
        }
        for (int i=0; i<y.length;i++){
            y[i] = y[i] + 1;
        }
        return y;
    }

预期产出:

1 2
2 3

实际输出:

2 3
2 3

从我发现的是分配两个整数时。即int x = y,这会导致x的存储位置被分配给y的存储位置,因为它们没有被正确初始化。但我并非百分百肯定,我在这里写的就是我所能找到的。

2 个答案:

答案 0 :(得分:0)

您正在覆盖方法x[]中的plusOne()数组。以下示例代码将实现您最初的想法:

public static int[] plusOne(int[] x) {
    int[] y = new int[x.length];
    System.arraycopy(x, 0, y, 0, x.length);

    for (int i=0; i < x.length; ++i) {
        y[i] = x[i] + 1;
    }

    return y;
}

在这里,我将输入数组x[]复制到一个新数组y[]中,然后将y[]初始化为x[]加一个添加。

plustOne()方法中的以下代码是您的问题的根源:

int [] y = x;
for (int i=0; i < y.length; ++i) {
    y[i] = y[i] + 1;
}

您指定y[]指向x[]存在 main()中的方法调用,然后取消引用数组并将其内容增加一。所以x[]数组加1,并且方法返回x[]加1。

答案 1 :(得分:0)

更改

int [] y = x;

int [] y = x.clone();

<强>解释

要了解最新情况,请在主要方法上添加以下声明

System.out.println(x+ ""+ y);

在第一种情况下,您将看到x和y都具有相同的id,因为赋值运算符只是将引用赋予原始数组。

在第二种情况下,您会看到x和y的不同ID。 Becasue clone()函数创建原始数组的副本。

相关问题