Given:



public class Test2 {

    public static void doChange(int... arr) {
        for (int pos = 0; pos < arr.length; pos++) {
            arr[pos] = arr[pos] + 1;
        }
    }

    public static void main(String[] args) {
        int[] arr = {10, 20, 30};
        doChange(arr);
        for (int x : arr) {
            System.out.print(x + ", ");
        }
        doChange(arr[0], arr[1], arr[2]);
        System.out.print(arr[0] + ", " + arr[1] + ", " + arr[2]);
    }
}

What is the result?

A. 11, 21, 31, 11, 21, 31
B. 11, 21, 31, 12, 22, 32
C. 12, 22, 32, 12, 22, 32
D. 10, 20, 30, 10, 20, 30

題解

程式第3行使用了Java的varargs使得doChange的參數長度可以變動。

Java傳遞變數內容的方式永遠為傳值(pass by value)。程式第11行直接將arr陣列物件變數所儲存的物件參考值傳給doChange方法使用,因此doChange可以對原先的arr陣列物件進行更動。程式第15行分別將arr整數陣列的整數元素傳給doChange方法,會把這些整數值複製另外一份空間出來給doChange的參數使用,因此數值在doChange的變化並不會影響到原先arr陣列物件的內容。