用Java传递参数

Sor*_*rOK 12 java pass-by-value

我知道Java总是按值传递,但我不明白为什么这样可行:

public static void swap(int[] arr, int i, int j)
{
    int tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}
public static void main(String[] args)
{
    int[] arr = {3, 4, 5, 6};
    swap(arr, 1, 3);
    // arr becomes {3, 6, 5, 4}
}
Run Code Online (Sandbox Code Playgroud)

这不起作用:

public static void swap(int[] arr, int[] arr2)
{
    int[] tmp = arr;
    arr = arr2;
    arr2 = tmp;
}
public static void main(String[] args)
{
   int[] arr = {3, 4, 5, 6};
   int[] arr2 = {1, 2, 5, 6};
   swap(arr, arr2);
}
Run Code Online (Sandbox Code Playgroud)

为什么?

geo*_*and 14

在第二种方法中,您尝试交换引用,这将无效,因为引用本身是按值传递的.

第一种方法正常工作,因为它更改了数组引用的对象(可变),它不会更改引用本身.

查看此博客文章,了解有关传值和传递引用之间差异的更多详细信息.


Pet*_*Mmm 7

您的第一个示例是传输数组中的值.

第二个是你试图交换引用(数组是Java中的对象).引用是本地副本(按值传递),并且对calee上下文没有影响.

(问题#56.903关于按值调用; Stackexchange应该打开PassByValue.com ;-)