java - 请解释这个 Java 数组引用参数传递行为

标签 java arrays parameter-passing pass-by-value

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。本地参数是对数组的引用的副本。稍后当你说

ar = temp;

您只将 local ar 指向 temp,而不是 中的原始数组引用 ar >主要

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

关于java - 请解释这个 Java 数组引用参数传递行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17604656/

相关文章:

java - 如何在junit中建立测试用例?

java - 找到 a[i] 和 a[j] 之间的最大可能差异,其中 0 < i < a.length 且 i < j < a.length

html - 随机颜色 CSS - 防止使用两次

jQuery colorbox - 从单击的链接获取 url 参数

c++ - 可变函数参数列表可以通过引用传递吗?

java - 关于按引用或值传递的概念

java - 将资源放在jar文件中并暴露给网络

java - 从 Java FX 中的给定日期获取周数

java - 后缀程序的中缀。空集合异常

java - 单个数组在每个元素中存储多个变量