值傳遞和引用傳遞

哒喇發表於2024-08-02

1、什麼是值傳遞,什麼是引用傳遞?
值傳遞(pass by value)是指在呼叫函式時將實際引數複製一份傳遞到函式中,這樣在函式中如果對引數進行修改,將不會影響到實際引數。
引用傳遞(pass by reference)是指在呼叫函式時將實際引數的地址直接傳遞到函式中,那麼在函式中對引數所進行的修改,將影響到實際引數。
2、值傳遞和引用傳遞的區別是什麼?

3.Java的堆記憶體和棧記憶體
堆:主要用於儲存例項化的物件,陣列。由JVM動態分配記憶體空間。一個JVM只有一個堆記憶體,執行緒是可以共享資料的。
棧:主要用於儲存區域性變數和物件的引用變數,每個執行緒都會有一個獨立的棧空間,所以執行緒之間是不共享資料的。
4.Java中只有值傳遞
錯誤理解一:值傳遞和引用傳遞,區分的條件是傳遞的內容,如果是個值,就是值傳遞。如果是個引用,就是引用傳遞
錯誤理解二:Java是引用傳遞。
錯誤理解三:傳遞的引數如果是普通型別,那就是值傳遞,如果是物件,那就是引用傳遞。
無論是值傳遞還是引用傳遞,其實都是一種求值策略(Evaluation strategy)。在求值策略中,還有一種叫做按共享傳遞(call by sharing)。其實Java中的引數傳遞嚴格意義上說應該是按共享傳遞。
按共享傳遞,是指在呼叫函式時,傳遞給函式的是實參的地址的複製(如果實參在棧中,則直接複製該值)。
在函式內部對引數進行操作時,需要先複製出地址,尋找到具體的值,再進行操作。如果該值在棧中,因為是直接複製的值,所以函式內部對引數進行操作不會對外部變數產生影響。
如果原來複製的是原值在堆中的地址,那麼需要先根據該地址找到堆中對應的位置,再進行操作。因為傳遞的是地址的複製,所以函式內對值的操作對外部變數是可見的。
簡單點說,Java中的傳遞,是值傳遞,而這個值,實際上是物件的引用。
而按共享傳遞其實只是按值傳遞的一個特例罷了。所以我們可以說Java的傳遞是按共享傳遞,或者說Java中的傳遞是值傳遞。

相關文章