编程语言
首页 > 编程语言> > 请解释此Java数组参考参数传递行为

请解释此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