请解释此Java数组参考参数传递行为

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  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的引用然后重新应用它的原始引用?

谢谢。

在Java中,说对象通过引用传递是一种误称。 更准确地说,对象的引用是按值传递的。

您通过值将数组引用传递给reverseArray 。 local参数是对数组的引用的副本。 后来当你说

 ar = temp; 

您只将本地 ar指向temp ,而不是main的原始数组引用ar

另一方面,在shiftRight方法中,您通过复制的引用直接访问了数组,因此原始数组的内容发生了变化,并且方法按预期工作。

reverseMethod接收自己对数组的引用,不能触及调用者的引用。

换句话说,它按值接收引用; 如果它选择在保存它的局部变量中存储一个新值,那么这很好,但它对可能存储旧值引用的其他地方没有影响。

问题是您创建了一个局部变量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(); } 

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