當我需要一個數組,像這樣:有人能解釋的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
這不是通過引用傳遞?是什麼賦予了?
當我需要一個數組,像這樣:有人能解釋的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
這不是通過引用傳遞?是什麼賦予了?
像數組這樣的引用類型仍然被視爲按值傳遞,因爲您傳遞的是引用值的副本。請注意,您沒有傳入實際的參考句柄。也就是說,您的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
或許可以澄清一下 - 你將無法爲你的'anArray'引用指定一個不同的數組並看到它在'doStuff'方法之外的效果。 – ZenMaster
良好的通話,更新的例子。 –
您的數組是存在於堆(內存中某處)的對象。只要您的程序中至少有一個指向它的活動引用,它就存在於那裏。
您可以將引用看作只是指向數組的鏈接或指針。引用通常只是一個小值,它告訴程序如何在內存地址訪問你關心的對象。假設參考點指向內存地址100.當您將引用傳遞給方法時,它將按值傳遞,以便方法獲取引用的副本。 100的新值進入該方法。
當您嘗試在該方法中對數組執行某些操作時,引用的值將被考慮並用於訪問內存中的對象。所以,我們查看地址100,獲取我們關心的對象並完成。
一旦你退出你的方法,方法內的引用值就會消失(它是一個局部變量),但在方法之外你仍然有一個引用的副本,你仍然可以使用它來訪問地址100你的對象在哪裏。
所以我們只知道對象是通過引用傳遞的,而對象總是在內存中的相同位置,而我們只是傳遞一個被複制的引用值。由於副本具有與方法外部相同的值地址,因此我們可以訪問同一個對象。
指針?誰說指針?談論Java時請不要談論指針! :p – Gevorg
抽象的,意識形態的,漂亮的指針! –
您正在修改可變對象的狀態,在這種情況下是數組。但是,當你出去試試這個代碼,你會發現,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));
}
}
Java是按值傳遞。期。
一個方法得到的是變量內容值的副本,總是。這對基元和對象都適用。在對象的情況下,變量的值是一個地址,告訴JVM如何在堆內存中找到對象。
考慮到你的情況,變量anArray
在doStuff
函數的開頭和doStuff
函數中都保持相同的值,告訴JVM如何檢索內存中的同一個數組(只有一個)。而已。
請注意,我甚至沒有必要使用「reference」這個詞來給出這個答案......並且,不會,在談論Java時,我絕不會使用「指針」這個詞。
關於通過參考值與值的巨大討論是here。
可能是[是Java「pass-by-reference」還是「pass-by-value」?](http:// stackoverflow。com/questions/40480/is-java-by-reference-or-pass-by-value) – Raedwald