2012-04-22 164 views
-2

在下面的代碼中,爲什麼arr2 [0]仍然等於1.5,即使在method2中更改了原始數組?忽略其他數組和變量。數組和參考傳遞

public class Problem3 
{ 
    public static int method1(int[] array) 
    { 
     array[0] += 10; 
     return array[0]; 
    } 

    public static int method2(int aNum, String aStr, 
     int[] array1, float[] array2, int[] array3) 
    { 
     float[] fNums = {1.5F, 2.5F}; 
     array2 = fNums; 

     return 10 + method1(array3); 
    } 

    public static void main(String[] args) 
    { 
     int num = 1000; 
     String aStr = "Hello!"; 
     int[] arr1 = {1, 2, 3}; 
     float[] arr2 = {0.5F, 1.5F}; 
     int[] arr3 = {5, 6, 7}; 
     int retNum = method2(num, aStr, arr1, arr2, arr3); 

     System.out.println(arr2[0]); 
    } 
} 
+0

基本上我以爲答案是1.5,但解決方案說0.5,我想知道如果有人能解釋? – 2012-04-22 20:31:35

+1

看到這個答案:http://stackoverflow.com/a/9404727/597657 – 2012-04-22 20:36:15

+0

在Java中沒有通過引用傳遞 – newacct 2012-04-23 01:20:57

回答

2

基本上,因爲array2不是arr2,但它們指的是同一陣列中存儲的調用method2

method2(num, aStr, arr1, arr2, arr3); 
public static int method2(int aNum, String aStr, int[] array1, float[] array2, int[] array3) 

然後,你讓array2指的是一個新的陣列fNums是指的是,你並沒有改變arr2反駁的陣列:

float[] fNums = {1.5F, 2.5F}; 
array2 = fNums; 

有關更多詳細信息,請參見此answer

2

,因爲你改變了參考整個陣列,並沒有修改。

過去了當你調用方法2的參數指向外面創建的陣列的方向。在method2中,您將參數指向新的數組。這不會改變調用方法中變量指向的數組,該數組仍然指向原始數組。

如果您只是修改了您在method2中給出的現有數組,那麼您會在調用方法中看到這些更改。

-1

我相信Java使用傳遞值傳遞語義的參數。通過在PSVM()中聲明float[] arr2,其範圍僅限於那裏,並且如果將該數組傳遞給另一個函數,它將按值傳遞。

另一方面,如果您已經聲明PSVM()(但在類定義中)的以外,那麼它的作用域在類中是全局的。然而,我仍然不認爲你的代碼可以工作,因爲IIRC,你不能用像你的代碼在method2()中那樣分配整個數組的值。