2011-08-29 47 views
3

當我需要一個數組,像這樣:有人能解釋的java是如何傳值只有當

int anArray[] = new int[5]; 
//initialize to 0 

doStuff(anArray); 

//inside doStuff 
anArray[3] = 731; 
//passes back to main 

System.out.println(anArray[3]); // outputs 731 

這不是通過引用傳遞?是什麼賦予了?

+0

可能是[是Java「pass-by-reference」還是「pass-by-value」?](http:// stackoverflow。com/questions/40480/is-java-by-reference-or-pass-by-value) – Raedwald

回答

5

像數組這樣的引用類型仍然被視爲按值傳遞,因爲您傳遞的是引用值的副本。請注意,您沒有傳入實際的參考句柄。也就是說,您的doStuff方法不能像傳遞引用語義那樣改變對anArray的引用。一個例子應該有助於理解它們之間的區別:

int anArray[] = new int[] { 99, 100}; 

doStuff(anArray); 
... 

//inside doStuff 
anArray = new int[] { 68, 69}; 

... 
// back in anArray's original scope 
System.out.println(anArray[1]); // still outputs 100, not 69 
+2

或許可以澄清一下 - 你將無法爲你的'anArray'引用指定一個不同的數組並看到它在'doStuff'方法之外的效果。 – ZenMaster

+0

良好的通話,更新的例子。 –

2

您的數組是存在於堆(內存中某處)的對象。只要您的程序中至少有一個指向它的活動引用,它就存在於那裏。

您可以將引用看作只是指向數組的鏈接或指針。引用通常只是一個小值,它告訴程序如何在內存地址訪問你關心的對象。假設參考點指向內存地址100.當您將引用傳遞給方法時,它將按值傳遞,以便方法獲取引用的副本。 100的新值進入該方法。

當您嘗試在該方法中對數組執行某些操作時,引用的值將被考慮並用於訪問內存中的對象。所以,我們查看地址100,獲取我們關心的對象並完成。

一旦你退出你的方法,方法內的引用值就會消失(它是一個局部變量),但在方法之外你仍然有一個引用的副本,你仍然可以使用它來訪問地址100你的對象在哪裏。

所以我們只知道對象是通過引用傳遞的,而對象總是在內存中的相同位置,而我們只是傳遞一個被複制的引用值。由於副本具有與方法外部相同的值地址,因此我們可以訪問同一個對象。

+0

指針?誰說指針?談論Java時請不要談論指針! :p – Gevorg

+1

抽象的,意識形態的,漂亮的指針! –

1

您正在修改可變對象的狀態,在這種情況下是數組。但是,當你出去試試這個代碼,你會發現,doStuff功能得到按值傳遞的數組:

public class try1 
{ 

    static void doStuff(int[] anArray) 
    { 
    anArray = new int[] { 
     5, 6, 7 
    }; 
    System.out.println(java.util.Arrays.toString(anArray)); 
    } 

    public static void main(String[] args) 
    { 
    int[] anArray = new int[] { 
     0, 1, 2 
    }; 
    System.out.println(java.util.Arrays.toString(anArray)); 

    doStuff(anArray); 
    System.out.println(java.util.Arrays.toString(anArray)); 
    } 

} 
0

Java是按值傳遞。期。

一個方法得到的是變量內容值的副本,總是。這對基元和對象都適用。在對象的情況下,變量的值是一個地址,告訴JVM如何在堆內存中找到對象。

考慮到你的情況,變量anArraydoStuff函數的開頭和doStuff函數中都保持相同的值,告訴JVM如何檢索內存中的同一個數組(只有一個)。而已。

請注意,我甚至沒有必要使用「reference」這個詞來給出這個答案......並且,不會,在談論Java時,我絕不會使用「指針」這個詞。

關於通過參考值與值的巨大討論是here