這篇文章給大家介紹Java中只有值傳遞的原因是什么,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
10余年的當雄網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。全網(wǎng)整合營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整當雄建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)公司從事“當雄網(wǎng)站設(shè)計”,“當雄網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
首先,我們得先知道什么叫值傳遞,什么叫引用傳遞,知道這個才能理解Java到底如何做的。若想理解這兩種傳遞需要先理解形式參數(shù)和實際參數(shù)兩個概念
形式參數(shù):定義函數(shù)時使用的參數(shù),用來接收函數(shù)傳入?yún)?shù),比如我們寫個函數(shù),函數(shù)中的參數(shù)為形式參數(shù)
public void test(String str) { //str為形式參數(shù) System.out.println(str); }
實際參數(shù):我們調(diào)用函數(shù)時,函數(shù)名后面括號中的參數(shù)稱為實際參數(shù),如下面例子所示
public static void main(String[] args) { A a = new A(); a.test("chengxukong");//chengxukong則為實際參數(shù) }
可以發(fā)現(xiàn),當調(diào)用一個有參函數(shù)的時候,會把實際參數(shù)傳遞給形式參數(shù);于是這個傳遞的過程便有兩種情況,即值傳遞和引用傳遞
值傳遞就是把參數(shù)的值給你,調(diào)用函數(shù)時將實際參數(shù)復(fù)制一份傳遞到函數(shù)中,這樣函數(shù)內(nèi)部對參數(shù)內(nèi)部進行修改不會影響到實際參數(shù);而引用傳遞就不一樣了,它直接把參數(shù)的實際地址給調(diào)用函數(shù)了,函數(shù)內(nèi)部可直接修改該地址內(nèi)容,會影響到實際參數(shù)
我來舉個例子,我司有一個數(shù)據(jù)庫A,僅允許內(nèi)部人員操作,現(xiàn)在有個項目需要和別的公司合作,該數(shù)據(jù)庫的數(shù)據(jù)需要交給合作公司一份,我總不能直接把我司數(shù)據(jù)庫A地址給他們,讓他們直接連我們數(shù)據(jù)庫A吧,他們要是刪庫跑路了,那我boss豈不要殺我祭天了
所以這個時候,把我司數(shù)據(jù)庫表數(shù)據(jù)拷貝一份到一個新的數(shù)據(jù)庫B,合作公司可以看這個數(shù)據(jù)庫B數(shù)據(jù),他們也可以隨意操作,不會影響我司數(shù)據(jù)庫
這個操作就類似于值傳遞,如果合作公司直接操作我司數(shù)據(jù)庫,就類似于引用傳遞了,這下大家應(yīng)該曉得兩者之別了
Java值傳遞還是引用傳遞?
我們了解了值傳遞和引用傳遞的概念,那Java中到底是哪種傳遞方式呢?我們來看代碼分析
public static void main(String[] args) { Fans fans = new Fans(); int t = 1; fans.test(t); System.out.println("In main:" + t); } public void test(int t) { t = 2; System.out.println("In test:" + t); } //輸出 In test:2 In main:1
上述代碼,在main中定義t的值是1,在函數(shù)test中修改了參數(shù)t的值為2,這個結(jié)果是不是很容易分析出來了呢?test函數(shù)并未改變傳入的t的值,那按照上面我們的介紹是不是可以得出結(jié)論:Java中是值傳遞
有的人可能會質(zhì)疑,你傳入的參數(shù)t是基本類型,你若傳入引用對象類型,那肯定就會改變對象內(nèi)容了,OK,再來看一段引用類型代碼
int a = 10; String b = "fans"; public void test(Fans fans) { fans.a = 20; fans.b = "newFans"; System.out.println("In test,A:" + fans.a+",B:"+fans.b); } public static void main(String[] args) { Fans fa = new Fans(); fa.test(fa); System.out.println("In main,A:" + fans.getA()+",B:"+fans.getB()); } //輸出 In test,A:20,B:newFans In main,A:20,B:newFans
哎啊,輸出結(jié)果竟然一樣了,也就是傳入的fans對象被函數(shù)test修改了,那這樣是不是又變成了引用傳遞了?
于是得出結(jié)論,基本類型是值傳遞,引用類型是引用傳遞?事實是這個樣子嗎,我們再來通過String這個引用類型實驗下
public void test(String t) { t = "BBB"; System.out.println("In test:" + t); } public static void main(String[] args) { Fans fans = new Fans(); String tt = "AAA"; fans.test(tt); System.out.println("In main:" + t); } //輸出 In test:BBB In main:AAA
啊,這,咋肥事,傳遞的參數(shù)值并未修改,怎么又變成值傳遞了
上述三個例子表現(xiàn)結(jié)果各有差異,到底結(jié)論是什么呢?一起來分析下
第一個傳入的是基本類型,基本類型指向的就是數(shù)值,傳遞類似于賦值操作,不會對原數(shù)值產(chǎn)生影響,就是類似于a=10,b=a,b=20這種,并不會使a變?yōu)?0;
第二個引用對象傳入的是引用類型fans的地址的值,傳入的原參數(shù)fa指向地址0x123456,所以函數(shù)test的參數(shù)fans也指向0x123456,函數(shù)內(nèi)部對引用fans進行修改,于是修改了0x123456地址的值,造成外部改變
第三個引用對象是String類型,同樣傳入的是原參數(shù)tt的指向地址0x123456,函數(shù)test參數(shù)t也是指向0x123456的值,那為什么這個和第二個結(jié)果不一樣的嘞?重點在于 t="BBB"; 這一句本來想嘗試著使內(nèi)容"AAA"改變成"BBB",但是無奈,String類型是static final類型的,這個大家應(yīng)該曉得的不,不曉得的該去補課讀讀String的源碼了,于是變成了 t=new String("BBB"),t指向了另一個地址,這個地址的內(nèi)容是"BBB",所以原來的引用tt還是指向原來的地址0x123456,并未改變
有的同學(xué)可能會提出問題了,為什么第二個可以改變這個地址的內(nèi)容,第三個不行?很明顯啊,String是final的,不可修改,而第二個可以直接修改該地址的內(nèi)容;那問題又來了,既然這樣,還能叫值傳遞嗎?
告訴你,就是值傳遞,因為我們第二個的驗證方法不對,你如果在函數(shù)的第一行加上個fans = new Fans();你看看它還輸出啥,這就變成和第三個String類似的道理了,改變了函數(shù)參數(shù)的指向位置,函數(shù)外部和函數(shù)內(nèi)部輸出就不一樣了,函數(shù)內(nèi)部也就不會影響外部了;如果按照應(yīng)引用傳遞,即使加了這一句,也應(yīng)該是函數(shù)內(nèi)外都是輸出一樣的,況且,這也有悖于引用傳遞的會改變傳入?yún)?shù)的概念
關(guān)于Java中只有值傳遞的原因是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
新聞標題:Java中只有值傳遞的原因是什么
當前URL:http://m.rwnh.cn/article24/iggije.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、電子商務(wù)、定制網(wǎng)站、網(wǎng)站設(shè)計公司、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)