溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java有幾種傳值方式

發(fā)布時(shí)間:2020-06-26 17:46:23 來源:億速云 閱讀:434 作者:Leah 欄目:編程語言

java有幾種傳值方式?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

值傳遞:是指在調(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ù)的值。

java怎么傳值?

java的傳值方式:值傳遞(所有發(fā)生的變化只限制在方法體中,出了方法體,任何的修改操作都不再有效)。

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

/**
 * 驗(yàn)證java中只有值傳遞
 */
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é)果分析

java有幾種傳值方式

下面我們以上圖為輔助,來分析這段程序,首先我們定義了一個(gè)User類,然后在測試類中實(shí)例化了一個(gè)User對(duì)象,名為user1,并且為其賦值name = '張三'。

此時(shí)在內(nèi)存中如圖1所示,實(shí)例化一個(gè)對(duì)象相當(dāng)于在堆中開辟了一塊內(nèi)存,內(nèi)存地址為017,此時(shí)這個(gè)對(duì)象的引用為user1,內(nèi)存地址為001,它保存了該對(duì)象在內(nèi)存中的地址,也就是指向了該對(duì)象。

接下了,我們調(diào)用方法change(),來嘗試改變user1name值以此驗(yàn)證java中的傳值方式。

我們將user1作為實(shí)參傳給change()方法,形參user2來接受這個(gè)實(shí)參,在這里就體現(xiàn)出了兩種傳參方式的不同。如果是按值傳遞,那么就像定義的那樣。

圖2所示,user2user1的一份副本,也就是說在傳遞參數(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ì)象的引用。

接著來分析輸出的結(jié)果,不管是按值傳遞還是引用傳遞,第1行輸出的結(jié)果一定都是張三,因?yàn)槎际侵赶蛲粋€(gè)對(duì)象。對(duì)于第2行輸出,我們還是無法判斷是哪種方式,因?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)用過程如 圖2~圖4所示,這樣才會(huì)使得user2指向一個(gè)新的對(duì)象后,user1指向的對(duì)象并沒有改變,還是原來那個(gè)對(duì)象。

對(duì)于基本類型的參數(shù)來說,a1的值最后沒有改變,說明在執(zhí)行方法時(shí),a2a1的一個(gè)副本。

對(duì)于引用類型的參數(shù)來說,例如User對(duì)象,在調(diào)用方法時(shí),實(shí)際上是將其引用user1作為實(shí)際參數(shù),那么傳遞給形參的將是該引用的一份副本引用user2,雖然說這是兩份引用(好比a1a2的關(guān)系)。

但是卻指向同一個(gè)對(duì)象,所有的操作也都是對(duì)這同一個(gè)對(duì)象而言的。

尾聲

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

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI