2013-07-11 43 views
3
public class TestArray { 
    public static void main(String[] args) { 
     int[] ar = {1,2,3,4,5,6,7,8,9}; 

     shiftRight(ar); 
     for (int i = 0; i < ar.length; i++) { 
      System.out.print(ar[i]); 
     } 
     // prints: 912345678 -- good 
     System.out.println(); 

     reverseArray(ar); 
     for (int i = 0; i < ar.length; i++) { 
      System.out.println(ar[i]); 
     } 
     // prints: 91234567 -- I don't understand  
     System.out.println();  
    } 
    public static void shiftRight(int[] ar) { 
     int temp = ar[ar.length - 1]; 
     for (int i = ar.length - 1; i > 0; i--) { 
      ar[i] = ar[i - 1]; 
     } 
     ar[0] = temp; 
    } 
    public static void reverseArray(int[] ar) { 
     int[] temp = new int[ar.length]; 
     for (int i = 0, j = temp.length - 1; i < ar.length; i++, j--) { 
      temp[i] = ar[j]; 
     } 
     ar = temp; 
     for (int i = 0; i < ar.length; i++) { 
      System.out.print(ar[i]); 
     } 
     // prints: 876543219 
     System.out.println(); 
    } 
} 

將數組傳遞給參數會導致將參數傳遞給參數;如果在方法中更改數組參數,則該更改將在方法外可見。請解釋此Java陣列參考參數傳遞行爲

第一種方法,shiftRight,做我所期望的:它改變方法外的數組。

但是,第二種方法不會改變方法外部的數組。但是在方法內部運行for循環會打印出正確的值。爲什麼ar的引用不是指temp?是否因爲變量temp在方法停止時被銷燬 - 是否也會殺死引用?即使是這樣的情況,爲什麼Java會採用ar,它指向temp的引用,然後將其重新應用到原始引用ar

謝謝。

回答

4

在Java中,說對象通過引用傳遞是錯誤的。更準確地說,對象的引用是按值傳遞的。

按值傳遞數組引用reverseArray。本地參數是對數組引用的副本。後來,當你說

ar = temp; 

你只是從main指出的當地artemp,不是原來的數組引用ar

另一方面,在shiftRight方法中,您已通過複製的引用直接訪問該數組,因此原始數組的內容會更改,並且該方法按預期工作。

+0

因此,雖然傳遞給參數的值是對數組的引用,但參數本身是其唯一變量(最初指向相同的引用),當指向本地數組時不會將外部變量指向該引用? –

+0

是的。在Java中傳遞的所有參數都是如此。 –

+0

是的,'ar = temp'將你本地的'ar'引用賦給'temp'引用的數組。 – rgettman

0

問題是你創建一個局部變量temp數組,並且你設置了ar=temp。實際上你需要修改ar的內容,而不是創建一個新的本地數組和指針複製的ar變量temp

Try something like this.

public static void reverseArray(int[] ar) { 
    int[] temp = new int[ar.length]; 
    System.arraycopy(ar, 0, temp, 0, ar.length); 
    for (int i = 0, j = temp.length - 1; i < ar.length; i++, j--) { 
     ar[i] = temp[j]; 
    } 

    for (int i = 0; i < ar.length; i++) { 
     System.out.print(ar[i]); 
    } 
    // prints: 876543219 
    System.out.println(); 
} 
+0

謝謝Jh413。 –

0

reverseMethod接收自己參考陣列和不能碰呼叫者的參考。

換句話說,它接收值的引用;如果它選擇在保存它的局部變量中存儲一個新值,那很好,但是對其他可能存儲對舊值的引用的地方沒有影響。

0

當你臨時分配的值AR

ar = temp; 

您設置方法的參數,以該值,不修改任何方式的主要方法AR的參考指針。

如果你希望你的修改「大棒」,然後從該方法返回的值,並將其分配在主,像這樣:

public static void main(String[] args) { 
    int[] ar = {1,2,3,4,5,6,7,8,9}; 

    ar = reverseArray(ar); 
    System.out.println();  
} 

public static int[] reverseArray(int[] ar) { 
    int[] temp = new int[ar.length]; 
    for (int i = 0, j = temp.length - 1; i < ar.length; i++, j--) { 
     temp[i] = ar[j]; 
    } 
    ar = temp; 
    for (int i = 0; i < ar.length; i++) { 
     System.out.print(ar[i]); 
    } 
    // prints: 876543219 
    System.out.println(); 

    return ar; // might as well return temp 
}