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

科普:

  • 值傳遞(pass by value)是指在調用函數時將實際參數複製一份傳遞到函數中,這樣在函數中如果對參數進行修改,將不會影響到實際參數。
  • 引用傳遞(pass by reference)是指在調用函數時將實際參數的地址直接傳遞到函數中,那麼在函數中對參數所進行的修改,將影響到實際參數。
值傳遞 引用傳遞
根本區別 會創建副本(Copy) 不創建副本,直接引用
效果 函數中無法改變原始對象 函數中可以改變原始對象

Java 中的實參与形參之間的傳遞到底是值傳遞還是引用傳遞呢?

其實之前我和大多數人一樣認為:傳遞的參數如果是“基本數據類型”,那就是“值傳遞”,如果是“引用類型”(即 對象),那就是“引用傳遞”。

但是昨天我突然覺得:好像。。。不一定!
誒,別急着懟我說:Nemo!你傳遞過對象沒啊,把對象傳過去,修改對象的屬性值,屬性值就是的的確確的修改了啊!

誒,你說的沒錯,確實是修改了,但是你也說了是修改對象的屬性值,傳過去的是對象地址,而你的實際操作並沒有對你傳入的地址進行修改,只是修改了對象地址下面的屬性值。

如果只是修改對象地址下面的屬性值的話,那麼值傳遞和引用傳遞有差嗎?
值傳遞:複製對象地址給函數,函數修改對象地址下面的屬性值。
引用傳遞:引用對象地址給函數,函數修改對象地址下面的屬性值。
這兩者有差嗎,無論是複製還是引用,傳入的對象地址都沒有改變,改變的只是對象地址下面的屬性值。

類比:我們可以類比一下,你家的地址是“北京市海淀區清華園1號”
引用傳遞:你給我引用你的地址,我過去你的地址那,打開你家的門,偷你家電動車的電瓶。
值傳遞:你不給我你的地址,我從網上找到你的地址,複製一份,過去你的地址那,打開你家的門,偷你家電動車的電瓶。
你瞧瞧,這兩者有差嗎?無論是怎樣拿到你家的地址,你家的電瓶我要定了啊,你家的電瓶都會被修改啊。

舉例代碼:

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 中只有值傳遞

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

您可能也會喜歡…