2014-01-13 190 views
0

我給了這兩個方法,當我運行question8時,它打印出「1 3」,但我不明白爲什麼。不應中的doSomething方法不影響在question8方法中的「ARR」陣列,因此打印出「2 4」爲什麼從其他方法修改原始數組?

private static void question8() { 
    int[] arr = {1,2,3,4}; 
    doSomething(arr); 
    System.out.print(arr[1] + " "); 
    System.out.print(arr[3]); 
} 
private static void doSomething(int[] list) { 
    int[] b = list; 
    for (int i = 0; i < b.length; i++) { 
     b[i] = i; 
    } 
} 
+3

你能否讓問題標題更有意義? –

+0

更好嗎? @Alien先生 讓我知道:) – herteladrian

+0

[是Java的「傳遞參考」?](http://stackoverflow.com/questions/40480/is-java-pass-by-reference) – Radiodef

回答

7

陣列是一種Object,參考變量值傳遞。訪問相同的對象。在你的代碼,

private static void doSomething(int[] list) { 
int[] b = list; // this means list and b are referring to the same array that was being referenced by list reference variable 
for (int i = 0; i < b.length; i++) { 
    b[i] = i; 
    } 
} 

這是怎麼一回事呢

  • 您創建question8()法陣。
  • 您它從question8()
  • 相同的數組對象被傳遞到正在由arr變量question8()方法稱爲doSomething()方法傳遞給doSomething()方法。
  • 現在你又在做int[] b = list這意味着變量b指的是被變量list引用的數組對象。數組對象又是一樣的。

要正確理解這件事,你可以閱讀關於pass by value in java with primitives and reference variables。參考變量部分對您很有用。

+0

我認爲所有的參數都是通過java中的值傳遞的,所以這個方法只是接收到一個單獨的數據副本。所以如果這是真的,爲什麼該方法doSomething會改變原始的ARR數組,即使它只使用它的一個副本? @Prasad Kharkar – herteladrian

+3

@ user1702529:參數確實是按值傳遞的。但是傳遞的不是對象或數組,而是*對象的引用*或對數組的引用*。如果將另一個數組分配給list參數,則main方法中的變量不會受到影響。 –

+0

@ user1702529。你知道的是真的。無論傳遞給方法的數據是否被複制。唯一的區別是整個數組沒有被傳遞。只有引用數組對象的引用變量被複制到另一個方法中。因此引用相同的數組對象。 –

相關問題