本篇內(nèi)容主要講解“java支持值傳遞還是引用傳遞”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“java支持值傳遞還是引用傳遞”吧!
創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),范縣企業(yè)網(wǎng)站建設(shè),范縣品牌網(wǎng)站建設(shè),網(wǎng)站定制,范縣網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,范縣網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
文章目的:驗(yàn)證Java語(yǔ)言到底是值傳遞還是引用傳遞以及Java參數(shù)傳遞的實(shí)現(xiàn)原理.
問(wèn)題引入:
先閱讀代碼段:
public static void main(String[] args){ Person p=new Person("張三"); f(p); System.out.println("實(shí)參:"+p);}public static void f(Person p){ p.name="李四"; System.out.println("形參:"+p);}
運(yùn)行結(jié)果:
形參:Person{name=“李四”}
實(shí)參:Person{name=“李四”}
我們將一個(gè)對(duì)象變量傳遞到方法中,然后在方法內(nèi)修改對(duì)象的屬性,打印實(shí)參和形參,從表面上看,實(shí)參形參的值都被修改了.難道Java也支持引用傳遞嗎?
答案是:Java語(yǔ)言只支持值傳遞,不支持引用傳遞. |
在驗(yàn)證Java參數(shù)傳遞方式之前,我們先要明白函數(shù)值傳遞和引用傳遞的區(qū)別.
值傳遞(pass by value)是指在調(diào)用函數(shù)時(shí)將實(shí)際參數(shù)復(fù)制一份傳遞到函數(shù)中,這樣在函數(shù)中如果對(duì)參數(shù)進(jìn)行修改,將不會(huì)影響到實(shí)際參數(shù)。
引用傳遞(pass by reference)是指在調(diào)用函數(shù)時(shí)將實(shí)際參數(shù)的地址直接傳遞到函數(shù)中,那么在函數(shù)中對(duì)參數(shù)所進(jìn)行的修改,將影響到實(shí)際參數(shù)。
可以看出值傳遞和引用傳遞的區(qū)別在于對(duì)形參的修改會(huì)不會(huì)影響到實(shí)參
我們將一個(gè)基本數(shù)據(jù)類型傳遞到方法中,然后在方法中修改形參的值,發(fā)現(xiàn)形參的修改并沒(méi)有影響到實(shí)參.
public static void main(String[] args){ int a=1; f(p); System.out.println("實(shí)參:"+a);}public static void f(int a){ a=2; System.out.println("形參:"+a);}
在問(wèn)題引入的例子中,看似形參的修改影響到了實(shí)參,但是只要我們創(chuàng)建一個(gè)新對(duì)象,并賦值給形參,此時(shí)再打印實(shí)參和形參,兩者互不影響.說(shuō)明Java并不符合引用傳遞.
public static void main(String[] args){ Person p=new Person("張三"); f(p); System.out.println("實(shí)參:"+p);}public static void f(Person p){ p=new Person("李四"); System.out.println("形參:"+p);}
我們要明白為什么會(huì)發(fā)生這些現(xiàn)象,就要理解Java背后的基本原理:
JVM劃分了很多塊區(qū)域,我們創(chuàng)建的對(duì)象就放在堆中,而基本數(shù)據(jù)類型和局部變量都放在棧中.當(dāng)傳遞基本數(shù)據(jù)類型時(shí),是將數(shù)據(jù)創(chuàng)建了一個(gè)副本傳遞到方法中,所以實(shí)參不會(huì)受到形參修改的影響,如圖:
由于對(duì)象是放在堆區(qū)的,所以我們只能使用對(duì)象的引用來(lái)操作這個(gè)對(duì)象.
當(dāng)對(duì)象引用傳遞給方法時(shí),其實(shí)是創(chuàng)建了一個(gè)引用副本,同時(shí)指向同一個(gè)對(duì)象,通過(guò)形參引用操作對(duì)象時(shí),就好像實(shí)參發(fā)生了變化,其實(shí)對(duì)象內(nèi)容改變了,但是對(duì)象變量沒(méi)有改變,實(shí)參本身是沒(méi)有改變的.因此引入問(wèn)題中的例子就不難理解了.
當(dāng)我們將形參重新賦值的時(shí)候,實(shí)參不會(huì)受到任何影響,此時(shí),實(shí)參和形參已經(jīng)指向了兩個(gè)不同的對(duì)象.
所以說(shuō),Java只支持值傳遞.
到此,相信大家對(duì)“java支持值傳遞還是引用傳遞”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!