void方法中的引用赋值

时间:2014-02-22 10:46:50

标签: java arrays reference pass-by-reference void

我给出了以下方法,该方法应该交换作为参数传递给方法的数组的前两个元素:

public void exchange(int[] a){
    int c[] = new int[a.length];
    c[0] = a[1];
    c[1] = a[0];
    for(int i = 2; i < a.length; i++)
        c[i] = a[i];
    a = c;
}

为什么这种方法不能按预期工作?

起初我以为我是因为c的范围仅限于该方法,参考分配a = c在该函数之外不会产生任何影响,但即使我使用c作为一个函数,该方法也不起作用附加参数。谁能告诉我为什么这种方法不起作用呢?

5 个答案:

答案 0 :(得分:2)

那是因为java参数总是pass-by-value

在您的示例中,您传递对对象的引用,但是此引用是按值传递的。换句话说,创建新的局部变量a并使用对数组的引用进行初始化。

如果你想交换两个值,你可以这样做:

public void exchange(int[] a){
    int temp = a[0];
    a[0] = a[1];
    a[1] = temp; 
}

但如果你这样做:

public void exchange(int[] a){        
    a = new int[10];    
}

然后只有局部变量a引用新数组。

答案 1 :(得分:2)

此方法无效,因为此行

a = c;

更改传递给int[]函数的exchange引用的值,而不触及引用的数组,因为对象引用是按值传递的。如果您想更改a的内容,请通过临时变量切换其元素,或使用arrayCopy方法或循环将c复制到a。< / p>

这是一个非常简单的实现,它交换了数组的两个初始元素:

public void exchange(int[] a) {
    if (a.length < 2) return;
    int tmp = a[0];
    a[0] = a[1];
    a[1] = tmp;
}

请注意检查代码中缺少的最小长度。当将零个或一个元素的数组传递给exchange方法时,它会阻止异常。

答案 2 :(得分:2)

您可以避免因不创建新数组而更改引用。这将更简单,更快,更快。

public static void exchange(int[] a) {
    int tmp = a[0];
    a[0] = a[1];
    a[1] = tmp;
}

您无法在Java中更改被调用方法中的参数,只能更改参数所指向的对象。

答案 3 :(得分:2)

它不起作用,因为a只是对数组的复制引用,对a的更改,如[0] = 1;反映在调用方法中,因为您正在更改引用的目标(即数组)而不是引用本身。 a = c,不起作用,因为它只更改对数组的本地引用而不是调用方法中的引用。 请在此处查看更详尽的解释:Is Java "pass-by-reference" or "pass-by-value"?

要将第一个交换为值,只需执行以下操作:

int temp = a[0];
a[0] = a[1];
a[1] = temp;

答案 4 :(得分:2)

您还可以返回更改的数组:

public int[] exchange(int[] a){
    int c[] = new int[a.length];
    c[0] = a[1];
    c[1] = a[0];
    for(int i = 2; i < a.length; i++)
        c[i] = a[i];
    return c;
}

并以这种方式使用此方法:

a = exchange(a);