值傳遞(pass by value)是指在調用函數(shù)時將實際參數(shù)復制一份傳遞到函數(shù)中,這樣在函數(shù)中如果對參數(shù)進行修改,將不會影響到實際參數(shù)。
引用傳遞(pass by reference)是指在調用函數(shù)時將實際參數(shù)的地址直接傳遞到函數(shù)中,那么在函數(shù)中對參數(shù)所進行的修改,將影響到實際參數(shù)。


稍微解釋下這張圖,當我們在main中創(chuàng)建一個User對象的時候,在堆中開辟一塊內存,其中保存了name和gender等數(shù)據(jù)。然后hollis持有該內存的地址0x123456(圖1)。
當嘗試調用pass方法,并且hollis作為實際參數(shù)傳遞給形式參數(shù)user的時候,會把這個地址0x123456交給user,這時,user也指向了這個地址(圖2)。
然后在pass方法內對參數(shù)進行修改的時候,即user = new User();,會重新開辟一塊0X456789的內存,賦值給user。后面對user的任何修改都不會改變內存0X123456的內容(圖3)。
上面這種傳遞是什么傳遞?肯定不是引用傳遞,如果是引用傳遞的話,在執(zhí)行user = new User();的時候,實際參數(shù)的引用也應該改為指向0X456789,但是實際上并沒有。
通過概念我們也能知道,這里是把實際參數(shù)的引用的地址復制了一份,傳遞給了形式參數(shù)。所以,上面的參數(shù)其實是值傳遞,把實參對象引用的地址當做值傳遞給了形式參數(shù)。
所以,值傳遞和引用傳遞的區(qū)別并不是傳遞的內容。而是實參到底有沒有被復制一份給形參,Java中其實還是值傳遞的,只不過對于對象參數(shù),值的內容是對象的引用。
簡單點說,Java中的傳遞,是值傳遞,而這個值,實際上是對象的引用。