[英]Please Explain this Java Array Reference Parameter Passing Behavior
public class TestArray {
public static void main(String[] args) {
int[] ar = {1,2,3,4,5,6,7,8,9};
shiftRight(ar);
for (int i = 0; i < ar.length; i++) {
System.out.print(ar[i]);
}
// prints: 912345678 -- good
System.out.println();
reverseArray(ar);
for (int i = 0; i < ar.length; i++) {
System.out.println(ar[i]);
}
// prints: 91234567 -- I don't understand
System.out.println();
}
public static void shiftRight(int[] ar) {
int temp = ar[ar.length - 1];
for (int i = ar.length - 1; i > 0; i--) {
ar[i] = ar[i - 1];
}
ar[0] = temp;
}
public static void reverseArray(int[] ar) {
int[] temp = new int[ar.length];
for (int i = 0, j = temp.length - 1; i < ar.length; i++, j--) {
temp[i] = ar[j];
}
ar = temp;
for (int i = 0; i < ar.length; i++) {
System.out.print(ar[i]);
}
// prints: 876543219
System.out.println();
}
}
将数组传递给参数会导致将对数组的引用传递给参数; 如果在方法中更改了数组参数,则该更改将在方法外部可见。
第一个方法shiftRight
完成了我的预期:它改变了方法之外的数组。
但是,第二种方法不会更改方法之外的数组。 但是在方法内部运行for循环会打印正确的值。 为什么ar
的引用不指向temp
? 是因为当方法停止时变量temp
被销毁 - 它是否也会杀死引用? 即使是这样的话,为什么Java的拿ar
,这是指向的参考temp
,然后重新应用它的原始参考ar
?
谢谢。
在Java中,说对象通过引用传递是一种误称。 更准确地说,对象的引用是按值传递的。
您通过值将数组引用传递给reverseArray
。 local参数是对数组的引用的副本。 后来当你说
ar = temp;
您只将本地 ar
指向temp
,而不是main
的原始数组引用ar
。
另一方面,在shiftRight
方法中,您通过复制的引用直接访问了数组,因此原始数组的内容发生了变化,并且方法按预期工作。
问题是您创建了一个局部变量temp
数组,并设置了ar=temp
。 您需要实际修改ar
的内容,而不是创建新的本地数组并将复制的ar
变量指向temp
public static void reverseArray(int[] ar) {
int[] temp = new int[ar.length];
System.arraycopy( ar, 0, temp, 0, ar.length );
for (int i = 0, j = temp.length - 1; i < ar.length; i++, j--) {
ar[i] = temp[j];
}
for (int i = 0; i < ar.length; i++) {
System.out.print(ar[i]);
}
// prints: 876543219
System.out.println();
}
reverseMethod
接收自己对数组的引用,不能触及调用者的引用。
换句话说,它按值接收引用; 如果它选择在保存它的局部变量中存储一个新值,那么这很好,但它对可能存储对旧值的引用的其他地方没有影响。
将temp的值分配给ar时
ar = temp;
您将方法的参数的指针设置为该值,该值不会以任何方式修改main方法中的ar引用。
如果您希望修改为“stick”,则返回该方法中的值并将其分配给main,如下所示:
public static void main(String[] args) {
int[] ar = {1,2,3,4,5,6,7,8,9};
ar = reverseArray(ar);
System.out.println();
}
public static int[] reverseArray(int[] ar) {
int[] temp = new int[ar.length];
for (int i = 0, j = temp.length - 1; i < ar.length; i++, j--) {
temp[i] = ar[j];
}
ar = temp;
for (int i = 0; i < ar.length; i++) {
System.out.print(ar[i]);
}
// prints: 876543219
System.out.println();
return ar; // might as well return temp
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.