1. 程式人生 > >【Java思考】Java 中的實參與形參之間的傳遞到底是值傳遞還是引用傳遞呢?

【Java思考】Java 中的實參與形參之間的傳遞到底是值傳遞還是引用傳遞呢?

科普: - **值傳遞**(pass by value)是指在呼叫函式時將實際引數複製一份傳遞到函式中,這樣在函式中如果對引數進行修改,將不會影響到實際引數。 - **引用傳遞**(pass by reference)是指在呼叫函式時將實際引數的地址直接傳遞到函式中,那麼在函式中對引數所進行的修改,將影響到實際引數。 ||值傳遞|引用傳遞| |---|---|---| |根本區別|會建立副本(Copy)|不建立副本,直接引用| |效果|函式中**無法改變**原始物件|函式中**可以改變**原始物件| # Java 中的實參與形參之間的傳遞到底是值傳遞還是引用傳遞呢? 其實之前我和大多數人一樣認為:傳遞的引數如果是“基本資料型別”,那就是“值傳遞”,如果是“引用型別”(即 物件),那就是“引用傳遞”。 但是昨天我突然覺得:好像。。。**不一定!** 誒,別急著懟我說:Nemo!你傳遞過物件沒啊,把物件傳過去,修改物件的屬性值,屬性值就是的的確確的修改了啊! 誒,你說的沒錯,確實是修改了,但是你也說了是修改物件的屬性值,傳過去的是物件地址,而你的實際操作並沒有對你傳入的地址進行修改,只是修改了物件地址下面的屬性值。 如果只是修改物件地址下面的屬性值的話,那麼值傳遞和引用傳遞有差嗎? **值傳遞:**複製物件地址給函式,函式修改物件地址下面的屬性值。 **引用傳遞:**引用物件地址給函式,函式修改物件地址下面的屬性值。 **這兩者有差嗎,無論是複製還是引用,傳入的物件地址都沒有改變,改變的只是物件地址下面的屬性值。** > **類比:**我們可以類比一下,**你家的地址是“北京市海淀區清華園1號”**。 > **引用傳遞:**你給我**引用**你的地址,我過去你的地址那,開啟你家的門,偷你家電動車的電瓶。 > **值傳遞:**你不給我你的地址,我從網上找到你的地址,**複製**一份,過去你的地址那,開啟你家的門,偷你家電動車的電瓶。 > 你瞧瞧,這兩者有差嗎?無論是怎樣拿到你家的地址,你家的電瓶我要定了啊,你家的電瓶都會被修改啊。 舉例程式碼: ```java package temp; /** * @author Nemo * @date 2020/6/22 */ public class ValueTransfer { public static void main(String[] args) { Home yourHome = new Home("你的家"); Nemo nemo = new Nemo(); nemo.steal(yourHome); yourHome.show(); } } class Home { public String name; public boolean battery = true; public boolean isBattery() { return battery; } public void setBattery(boolean battery) { this.battery = battery; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Home(String name) { this.name = name; } public void show() { if (this.isBattery()) { System.out.println(name + "的電瓶還在喲~"); } else { System.out.println(name + "的電瓶被偷了!"); } } } class Nemo { public void steal(Home home) { //如果是引用傳遞的話,那麼我把你的家整個都變為了別人的家,那麼你的家物件上現在應該存放的是別人的家 //如果是值傳遞的話,那麼我只是把你的家物件複製了一個新的,這個新的家是別人的家,我偷一個跟你家一模一樣的別人家的電瓶,你家的電瓶應該不會變 home = new Home("別人的家"); home.battery = false; home.show(); } } ``` 在 Nemo 類的 steal 方法中,我們可以看到註釋: 1. 如果是**引用傳遞**,那麼我把你的家整個都變為了別人的家,那麼你的家物件上現在應該存放的是別人的家,並且你家(即 別人家)的電瓶也應該被我偷了。 2. 如果是**值傳遞**,那麼我只是把你的家物件引數複製了一個新的,這個新的家我設為了別人的家,我偷一個跟你家一模一樣的別人家的電瓶,你家的電瓶應該不會變。 執行結果: ``` 別人的家的電瓶被偷了! 你的家的電瓶還在喲~ ``` 根據執行結果來看,很顯然,是第二種情況,也就是值傳遞,我偷的是一個跟你家一模一樣的別人家的電瓶,而你家的電瓶還在。 # 結論 Java 中只有**值傳