成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

java中傳值方式的個(gè)人理解

vvpvvp / 2477人閱讀

摘要:接下了,我們調(diào)用方法,來(lái)嘗試改變的值以此驗(yàn)證中的傳值方式。我們將作為實(shí)參傳給方法,形參來(lái)接受這個(gè)實(shí)參,在這里就體現(xiàn)出了兩種傳參方式的不同。中只有值傳遞這一種方式,只不過(guò)對(duì)于引用類(lèi)型來(lái)說(shuō),傳遞的參數(shù)是對(duì)象的引用罷了。

前言

這幾天在整理java基礎(chǔ)知識(shí)方面的內(nèi)容,對(duì)于值傳遞還不是特別理解,于是查閱了一些資料和網(wǎng)上相關(guān)博客,自己進(jìn)行了歸納總結(jié),最后將其整理成了一篇博客。

值傳遞

值傳遞是指在調(diào)用函數(shù)時(shí)將實(shí)際參數(shù)復(fù)制一份傳遞給形參,這樣在函數(shù)中對(duì)形參的修改將不會(huì)影響到實(shí)際參數(shù)的值。

引用傳遞

引用傳遞是指在調(diào)用函數(shù)時(shí)將實(shí)際參數(shù)的地址直接傳遞到形參,那么在函數(shù)中對(duì)參數(shù)所進(jìn)行的修改,將會(huì)影響到實(shí)際參數(shù)的值。

我們可以使用一段程序來(lái)驗(yàn)證Java中只有值傳遞

/**
 * 驗(yàn)證java中只有值傳遞
 * Dmego 2018-8-27
 */

class User{
    
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

public class TestValue {
    public static void change(User user2,int a2){
        System.out.println("改變之前:"+user2.getName()+",a2="+a2);
        
        user2.setName("李四"); //改變 user2 的 name 值
        a2 = 10; //改變 a2 的值
        System.out.println("改變之后:"+user2.getName()+",a2="+a2);
        
        user2 = new User(); //將 user2 重新指向一個(gè)新對(duì)象
        user2.setName("王五");
        System.out.println("重新指向一個(gè)新對(duì)象后:"+user2.getName());
    }

    public static void main(String[] args){
        User user1 = new User();
        user1.setName("張三"); //初始化 user1 的 name 為張三
        int a1 = 5; //初始化 a1 的值為 5
        change(user1,a1); //調(diào)用方法驗(yàn)證傳值方式
        System.out.println("調(diào)用方法后:"+user1.getName()+",a1="+a1);
    }
}

運(yùn)行這段程序,輸出結(jié)果為:

改變之前:張三,a2=5
改變之后:李四,a2=10
重新指向一個(gè)新對(duì)象后:王五
調(diào)用方法后:李四,a1=5
結(jié)果分析

下面我們以上圖為輔助,來(lái)分析這段程序,首先我們定義了一個(gè)User類(lèi),然后在測(cè)試類(lèi)中實(shí)例化了一個(gè)User對(duì)象,名為user1,并且為其賦值name = "張三",此時(shí)在內(nèi)存中如圖1所示,實(shí)例化一個(gè)對(duì)象相當(dāng)于在堆中開(kāi)辟了一塊內(nèi)存,內(nèi)存地址為017,此時(shí)這個(gè)對(duì)象的引用為user1,內(nèi)存地址為001,它保存了該對(duì)象在內(nèi)存中的地址,也就是指向了該對(duì)象。接下了,我們調(diào)用方法change(),來(lái)嘗試改變user1name值以此驗(yàn)證java中的傳值方式。

我們將user1作為實(shí)參傳給change()方法,形參user2來(lái)接受這個(gè)實(shí)參,在這里就體現(xiàn)出了兩種傳參方式的不同。如果是按值傳遞,那么就像定義的那樣,如圖2所示,user2user1的一份副本,也就是說(shuō)在傳遞參數(shù)時(shí),將user1(本身是一個(gè)對(duì)象的引用),復(fù)制了一份,名為user2,它同樣也是一個(gè)對(duì)象的引用,并且user1user2此時(shí)指向同一個(gè)對(duì)象。而如果是引用傳遞,也如同定義的那樣,如圖5所示,在傳遞參數(shù)時(shí),是直接將user1傳遞給了形參,只是換了一個(gè)名字叫做user2,但是本質(zhì)上user1user2其實(shí)是同一個(gè)。它是一個(gè)對(duì)象的引用。

接著來(lái)分析輸出的結(jié)果,不管是按值傳遞還是引用傳遞,第1行輸出的結(jié)果一定都是張三,因?yàn)槎际侵赶蛲粋€(gè)對(duì)象。對(duì)于第2行輸出,我們還是無(wú)法判斷是哪種方式,因?yàn)槎际歉淖兺粋€(gè)對(duì)象,值也會(huì)改變;關(guān)鍵在于第3行輸出和第4行輸出,此時(shí),我們將user2重新指向了一個(gè)新的對(duì)象,并且為這個(gè)對(duì)象賦值name = "王五",如果是引用傳遞的方式,那么user1同樣也會(huì)改變指向,指向新的這個(gè)對(duì)象,最后一行調(diào)用方法之后輸出的結(jié)果將會(huì)和第3行一樣是王五,但是事實(shí)輸出的是李四,這表明user1user2其實(shí)并不是同一個(gè)。真實(shí)的調(diào)用過(guò)程如 圖2~圖4所示,這樣才會(huì)使得user2指向一個(gè)新的對(duì)象后,user1指向的對(duì)象并沒(méi)有改變,還是原來(lái)那個(gè)對(duì)象。

對(duì)于基本類(lèi)型的參數(shù)來(lái)說(shuō),a1的值最后沒(méi)有改變,說(shuō)明在執(zhí)行方法時(shí),a2a1的一個(gè)副本。對(duì)于引用類(lèi)型的參數(shù)來(lái)說(shuō),例如User對(duì)象,在調(diào)用方法時(shí),實(shí)際上是將其引用user1作為實(shí)際參數(shù),那么傳遞給形參的將是該引用的一份副本引用user2,雖然說(shuō)這是兩份引用(好比a1a2的關(guān)系)。但是卻指向同一個(gè)對(duì)象,所有的操作也都是對(duì)這同一個(gè)對(duì)象而言的。

最后舉一個(gè)例子來(lái)形象的說(shuō)明這一切,假如你有一把你房間的鑰匙,并且在上面刻上了你的名字,這個(gè)過(guò)程好比給一個(gè)int類(lèi)型的a1初始化值為5。你的朋友和你關(guān)系非常好,想要你房間的鑰匙,此時(shí)你并沒(méi)有直接把你的鑰匙給他,而是復(fù)制了一把新的鑰匙,這個(gè)鑰匙也能開(kāi)你的房間的門(mén)。而你的朋友在這把新鑰匙上刻上了他的名字。這個(gè)過(guò)程就好比調(diào)用change()方法,把a1復(fù)制了一份賦值給a2,此時(shí)修改a2a1沒(méi)有任何關(guān)系,你朋友在新鑰匙上刻他名字也不會(huì)影響你手上那把原始的鑰匙。關(guān)鍵是這兩把鑰匙都能開(kāi)你的房間,就好比user1user2都指向同一個(gè)對(duì)象。此時(shí)你朋友用這把新鑰匙打開(kāi)了你的房間,將你房間電視機(jī)砸了。這個(gè)過(guò)程好比改名李四。這時(shí)你拿著你的鑰匙打開(kāi)你房間必然會(huì)看到這樣的場(chǎng)景——電視機(jī)被砸了。就如同調(diào)用方法后user1變成了李四。在調(diào)用方法的過(guò)程中,最后user2重新指向了一個(gè)新的對(duì)象,這就好比你的朋友將你復(fù)制給他的鑰匙再次進(jìn)行了加工,此時(shí)不能開(kāi)你房間的門(mén),但是能開(kāi)他自己的房間,他用這把鑰匙開(kāi)自己的房間然后把自己的電視砸了這并不會(huì)影響到你房間的電視,也就是說(shuō)最后user1的名字并不會(huì)變成王五。這就是java中的值傳遞。當(dāng)然了,如果是引用傳遞,那么這個(gè)例子中從頭到尾將會(huì)只有一把鑰匙,最后的結(jié)果也將會(huì)不同。

尾聲

通過(guò)以上分析我們可以知道。Java中只有值傳遞這一種方式,只不過(guò)對(duì)于引用類(lèi)型來(lái)說(shuō),傳遞的參數(shù)是對(duì)象的引用罷了。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76883.html

相關(guān)文章

  • 微信小程序 傳值取值方法總結(jié)

    摘要:如果需要類(lèi)似即時(shí)響應(yīng)的,應(yīng)該選用后者,因?yàn)槟苁褂脕?lái)實(shí)現(xiàn)即時(shí)取到值,比如商品搜索框輸入手機(jī)關(guān)鍵字,應(yīng)出現(xiàn),等候選詞這樣的場(chǎng)景。 微信小程序 傳值取值的幾種方法總結(jié) 列表index下標(biāo)取值 頁(yè)面?zhèn)髦?form表單取值 1. 列表index下標(biāo)取值 實(shí)現(xiàn)方式是:data-index={{index}}挖坑及e.currentTarget.dataset.index來(lái)填坑即可 1.1 生成...

    JerryWangSAP 評(píng)論0 收藏0
  • Vue Slot用法

    摘要:示例這是命名的節(jié)點(diǎn)該節(jié)點(diǎn)在邏輯代碼中,可以使用來(lái)獲取命名的。該節(jié)點(diǎn)在文件中,可以使用來(lái)承接命名的。 showImg(https://segmentfault.com/img/bVxM4v?w=797&h=250); Vue在講組件時(shí),建議最好不要在父作用域中傳值給子組件,不知道為什么用slot; slot背景 為什么要用slot? 個(gè)人理解: 為了保證組件內(nèi)容的靈活性,組件的內(nèi)容由...

    liangdas 評(píng)論0 收藏0
  • vue組件間通信、數(shù)據(jù)傳遞(父子組件,同級(jí)組件)

    總結(jié)一下對(duì)vue組件通信的理解和使用。 一、組件目錄結(jié)構(gòu) 父組件:app.vue 子組件:page1.vue 子組件:page2.vue 父組件 app.vue 請(qǐng)輸入單價(jià): import Page1 from ./components/page1; import Page2 from ./components/page2; export de...

    Harpsichord1207 評(píng)論0 收藏0
  • vue組件間通信、數(shù)據(jù)傳遞(父子組件,同級(jí)組件)

    總結(jié)一下對(duì)vue組件通信的理解和使用。 一、組件目錄結(jié)構(gòu) 父組件:app.vue 子組件:page1.vue 子組件:page2.vue 父組件 app.vue 請(qǐng)輸入單價(jià): import Page1 from ./components/page1; import Page2 from ./components/page2; export de...

    tunny 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<