传递数组引用时,如何更改对其他数组的引用?

时间:2015-04-15 20:49:00

标签: java reference

我正在测试此代码。

class something {
    public static void main(String[] args) {
        int[] a = {1, 2, 3, 4, 5};
        sth(a);
        System.out.println(a);
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }
    }

    public static void sth(int[] a){
        int[] b = new int[a.length];
        for (int i = 0; i < a.length; i++) {
            b[i] = 0;
        }

        a = b;
        System.out.println(a);
        System.out.println(b);
    }
}

预期产出:

SAME MEMORY VALUE
0 0 0 0 0

我的目标

[I@46d20791
[I@46d20791
[I@2c7f1f63
1 2 3 4 5

然而改变行

b[i] = 0; 

a[i] = 0;

反映了对

的更改
[I@46d20791
[I@46d20791
[I@2c7f1f63
0 0 0 0 0

帮助我了解那里发生了什么?

1 个答案:

答案 0 :(得分:0)

sth执行a = b时,您只是将本地参考a(参数)更改为指向b,您不会更改主方法变量a的参考。

在您调用System.out.print(a[i] + " ");的主方法中,它引用主方法变量a(范围内唯一的a),该方法保持不变。

当您将代码更改为a[i] = 0;时,参数的本地引用a仍然引用主方法变量a,因此代码按预期工作。

在不更改代码的情况下获得所需行为的一种方法是更改​​方法以返回您希望方法方法a使用的引用:

// in the method method
a = sth(a);
...

public static int[] sth(int[] a){
    ...
    return a; // if keeping local_a_reference=b;
}