深入探究Java編程是值傳遞還是引用傳遞
文章目的:驗(yàn)證Java語言到底是值傳遞還是引用傳遞以及Java參數(shù)傳遞的實(shí)現(xià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à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í)參
1.基本數(shù)據(jù)類型的參數(shù)傳遞
我們將一個(gè)基本數(shù)據(jù)類型傳遞到方法中,然后在方法中修改形參的值,發(fā)現(xiàn)形參的修改并沒有影響到實(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); }
2.引用數(shù)據(jù)類型的參數(shù)傳遞
在問題引入的例子中,看似形參的修改影響到了實(shí)參,但是只要我們創(chuàng)建一個(gè)新對(duì)象,并賦值給形參,此時(shí)再打印實(shí)參和形參,兩者互不影響.說明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); }
3.原理
我們要明白為什么會(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ì)象的引用來操作這個(gè)對(duì)象.
當(dāng)對(duì)象引用傳遞給方法時(shí),其實(shí)是創(chuàng)建了一個(gè)引用副本,同時(shí)指向同一個(gè)對(duì)象,通過形參引用操作對(duì)象時(shí),就好像實(shí)參發(fā)生了變化,其實(shí)對(duì)象內(nèi)容改變了,但是對(duì)象變量沒有改變,實(shí)參本身是沒有改變的.因此引入問題中的例子就不難理解了.
當(dāng)我們將形參重新賦值的時(shí)候,實(shí)參不會(huì)受到任何影響,此時(shí),實(shí)參和形參已經(jīng)指向了兩個(gè)不同的對(duì)象.
所以說,Java只支持值傳遞.
到此這篇關(guān)于深入探究Java編程是值傳遞還是引用傳遞的文章就介紹到這了,更多相關(guān)Java值傳遞內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決異常:Invalid?keystore?format,springboot配置ssl證書格式不合法問題
這篇文章主要介紹了解決異常:Invalid?keystore?format,springboot配置ssl證書格式不合法問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03有關(guān)ServletConfig與ServletContext的訪問
下面小編就為大家?guī)硪黄嘘P(guān)ServletConfig與ServletContext的訪問。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01Java中BigInteger與BigDecimal類用法總結(jié)
在Java中有兩個(gè)用于大數(shù)字運(yùn)算的類,分別是java.math.BigInteger類 和 java.math.BigDecimal類,這兩個(gè)類都可以用于高精度計(jì)算,BigInteger類是針對(duì)整型大數(shù)字的處理類,而BigDecimal類是針對(duì)大小數(shù)的處理類,接下來帶大家來學(xué)習(xí)一下,在Java中如何處理大數(shù)字2023-05-05半小時(shí)實(shí)現(xiàn)Java手?jǐn)]網(wǎng)絡(luò)爬蟲框架(附完整源碼)
最近在做一個(gè)搜索相關(guān)的項(xiàng)目,需要爬取網(wǎng)絡(luò)上的一些鏈接存儲(chǔ)到索引庫中,自己寫了一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)爬蟲,感興趣的可以了解一下2021-06-06Java判斷對(duì)象是否為空(包括null ,"")的方法
這篇文章主要介紹了Java判斷對(duì)象是否為空(包括null ,"")的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05Java實(shí)現(xiàn)HttpGet請(qǐng)求傳body參數(shù)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)HttpGet請(qǐng)求傳body參數(shù)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02Javaweb 鼠標(biāo)移入移出表格顏色變化的實(shí)現(xiàn)
這篇文章主要介紹了Javaweb 鼠標(biāo)移入移出表格顏色變化的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09