请解释此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 < 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会采用指向temp引用的ar,然后将其重新应用为ar的原始引用呢?
谢谢.
解决方法:
在Java中,说对象是通过引用传递的是一个错误的说法.准确地说,对对象的引用是通过值传递的.
您按值将数组引用传递给reverseArray.局部参数是对数组的引用的副本.以后当你说
ar = temp;
您仅将本地ar指向temp,而不是将main指向原始数组引用ar.
另一方面,在shiftRight方法中,您已经通过复制的引用直接访问了数组,因此原始数组的内容发生了变化,该方法可以按预期工作.
标签:parameter-passing,pass-by-value,arrays,java 来源: https://codeday.me/bug/20191030/1969639.html