Java int [] arr陣列以“引用”方式被傳遞
阿新 • • 發佈:2019-02-13
最近遇到了一個有趣的問題?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