为什么Java不像#34; Pass-By-Value"这里?

时间:2015-01-08 01:30:14

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

以下主要输出为 [5,4,3,2,1] [1,2,3,4,5]

这对我没有意义。是的,我第一次跑#34; reverseArrayIteratively",我绝对期待[5,4,3,2,1]以便正确的输出,但在第二个功能之后( reverseArrayRecursively),我期待它也返回[5,4,3,2,1],因为Java应该是"通过值",所以我没有期望" reverseArrayIteratively"实际上改变myIntArray的值。我认为main中的myIntArray将保持[1,2,3,4,5]无论我调用reverseArrayIteratively或reverseArrayRecursively多少次。这里发生了什么?

public static void main(String[] args) {
        // TODO Auto-generated method stub  
        int[] myIntArray = {1,2,3,4,5};
        System.out.println(Arrays.toString(reverseArrayIteratively(myIntArray, 0, myIntArray.length-1)));
        System.out.println(Arrays.toString(reverseArrayRecursively(myIntArray, 0, myIntArray.length-1)));
    }

    public static int[] reverseArrayIteratively(int[] array, int first, int end) {
        while (first < end) {
            int temp = array[end];
            array[end] = array[first];
            array[first] = temp;
            first++;
            end--;
        }
        return array;   
    }   

    public static int[] reverseArrayRecursively(int[] array, int first, int end) {
        int temp = array[end];
        array[end] = array[first];
        array[first] = temp;
        first++;
        end--;
        if (first < end) {
            reverseArrayRecursively(array, first, end);
        }
        else {
            return array;
        }
        return array;
    }

1 个答案:

答案 0 :(得分:4)

它表现为传值。我认为,你的困惑源于对非原始参数的意义(而数组是一个对象,而不是一个基元)。对于对象参数,通过值传递的内容始终是对象的引用。在递归方法中,您正在修改数组参数的元素,因此它当然是在调用代码中更改数组元素。

如果您来自C ++背景,请将Java引用视为C ++指针,而不是C ++引用。