1. 程式人生 > >Java int [] arr陣列以“引用”方式被傳遞

Java int [] arr陣列以“引用”方式被傳遞

最近遇到了一個有趣的問題?java方法引數的傳遞是不是總是按值傳遞(pass-by-value)?

1.看案例

class TestDemo
{

    public static void main(String[] args) 
    {
        int [] arr1=new int[]{1,3,6,2,9};
        printArrays(arr1);//輸出的結果:13629
        reverseArray(arr1);//輸出的結果:92631
        printArrays(arr1);//輸出的結果:13629
    }

    /**求逆向陣列*/
public static void reverseArray(int [] arr){ int [] arr_new=new int[arr.length]; for(int i=0;i<arr.length;i++){ arr_new[arr.length-1-i]=arr[i]; } arr=arr_new;//這裡到底有沒有改變原本arr1的引用? printArrays(arr); } /**列印陣列*/ public static void printArrays
(int [] arr){ for(int i=0;i<arr.length;i++){ System.out.print(arr[i]); } System.out.println(""); } }

2.案例分析

  • 執行上面的main方法輸出的結果是:

    printArrays(arr1);//輸出的結果:13629
    reverseArray(arr1);//輸出的結果:92631
    printArrays(arr1);//輸出的結果:13629
    
  • 為什麼執行main方法輸出的結果不是:

    printArrays(arr1);//輸出的結果:13629
    reverseArray(arr1);//輸出的結果:92631
    printArrays(arr1);//輸出的結果:92631
    
  • 求逆向陣列那個方法傳遞的不是陣列的引用麼?:

    其實在java中,方法引數的傳遞總是按值傳遞的(pass-by-value),上面的這個reverseArray方法固然也是值傳遞,只不過接收的引數是一個引用,而不是基本資料型別。既然是reverseArray方法是值傳遞,那麼arr=arr_new;這行程式碼是不會改變arr1的引用,因為reverseArray方法是值傳遞嘛。reverseArray方法裡接收的那個引數明明是引用呀?是,該引數的值是一個引用。

  • java方法引數的傳遞總是按值傳遞:

    java中的方法的引數總是按值傳遞的,但是接收的引數可能會是一個引用,也有可能會是一個基本的資料型別。如果是一個引用,那麼我們就可以拿到該引用去操作該引用指向的記憶體的資料。例如上面的例子:

    引數接收的是一個數組引用,通過該引用可以去運算元組:arr.length 、 arr[i] 都是通過參進來的引用去運算元組。

  • 上面的TestDemo如何修改才能實現修改arr1的引用?:

    只修改reverseArray方法,該方法只要返回一個int [] 引用,並重新賦值給arr1即可改變arr1的引用。

class TestDemo
{

    public static void main(String[] args) 
    {
        int [] arr1=new int[]{1,3,6,2,9};
        printArrays(arr1);//輸出的結果:13629
        arr1=reverseArray(arr1);//輸出的結果:92631
        printArrays(arr1);//輸出的結果:13629
    }

    /**求逆向陣列*/
    public static int [] reverseArray(int [] arr){
        int [] arr_new=new int[arr.length];
        for(int i=0;i<arr.length;i++){
            arr_new[arr.length-1-i]=arr[i];
        }
        arr=arr_new;//這裡到底有沒有改變原本arr1的引用?
        printArrays(arr);
        return arr;
    }

    /**列印陣列*/
    public static void printArrays(int [] arr){
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]);
        }
        System.out.println("");
    }

}

  • 修改後執行上面的main方法輸出的結果是:

    printArrays(arr1);//輸出的結果:13629
    arr1=reverseArray(arr1);//輸出的結果:92631
    printArrays(arr1);//輸出的結果:92631