Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java void方法中的引用赋值_Java_Arrays_Reference_Pass By Reference_Void - Fatal编程技术网

Java void方法中的引用赋值

Java void方法中的引用赋值,java,arrays,reference,pass-by-reference,void,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; } 公共无效交换(int[]a){ int c[]=新的int[a.长度]; c[

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

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;
}
公共无效交换(int[]a){
int c[]=新的int[a.长度];
c[0]=a[1];
c[1]=a[0];
for(int i=2;i
为什么这个方法不能按预期工作


起初我认为我是因为c的作用域仅限于该方法,引用赋值a=c在该函数之外不会有任何影响,但即使我使用c作为附加参数,该方法也不起作用。有人能告诉我为什么这个方法不起作用吗?

那是因为在java中参数总是
按值传递

在您的示例中,将引用传递给对象,但该引用是按值传递的。换句话说,将创建新的局部变量
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
引用新数组。

此方法无法按预期工作,因为此行

a = c;
将引用的值更改为
int[]
传递到
exchange
函数中,而不接触引用的数组,因为对象引用是按值传递的。如果要更改
a
的内容,请通过临时变量将其元素切换到位,或使用方法或循环将
c
复制到
a

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

public void exchange(int[] a) {
    if (a.length < 2) return;
    int tmp = a[0];
    a[0] = a[1];
    a[1] = tmp;
}
公共无效交换(int[]a){
如果(a.长度<2)返回;
int tmp=a[0];
a[0]=a[1];
a[1]=tmp;
}

注意检查代码中缺少的最小长度。当一个由零个或一个元素组成的数组被传递给
交换
方法时,它可以防止异常。

您可以通过不创建新数组来避免更改引用。这将更简单、更快

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

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

它不起作用,因为a只是对数组的复制引用,对a的更改,如[0]=1;反映在调用方法中,因为您正在更改引用的目标(即数组),而不是引用本身。 a=c不起作用,因为它只更改对数组的本地引用,而不是调用方法中的引用。 请参见此处更深入的说明:

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

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

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

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;
}

这应该有帮助:您不能更改按值传递的引用。在Java中,所有参数都是按值传递的。
a = exchange(a);