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