這篇文章主要講解了“java是值傳遞嗎”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“java是值傳遞嗎”吧!
創(chuàng)新互聯(lián)建站長期為千余家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為彭州企業(yè)提供專業(yè)的網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì),彭州網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
java是值傳遞;值傳遞是指在調(diào)用方法時(shí)將實(shí)際參數(shù)拷貝一份傳遞到方法中,這樣在方法中如果對參數(shù)進(jìn)行修改,將不會(huì)影響到實(shí)際參數(shù);當(dāng)傳的是基本類型時(shí),傳的是值的拷貝,對拷貝變量的修改不影響原變量;當(dāng)傳的是引用類型時(shí),傳的是引用地址的拷貝,但是拷貝的地址和真實(shí)地址指向的都是同一個(gè)真實(shí)數(shù)據(jù),因此可以修改原變量中的值。
本教程操作環(huán)境:windows10系統(tǒng)、DELL G3電腦。
Java是值傳遞。
當(dāng)傳的是基本類型時(shí),傳的是值的拷貝,對拷貝變量的修改不影響原變量;當(dāng)傳的是引用類型時(shí),傳的是引用地址的拷貝,但是拷貝的地址和真實(shí)地址指向的都是同一個(gè)真實(shí)數(shù)據(jù),因此可以修改原變量中的值;當(dāng)傳的是String類型時(shí),雖然拷貝的也是引用地址,指向的是同一個(gè)數(shù)據(jù),但是String的值不能被修改,因此無法修改原變量中的值。
首先來解釋一下什么是引用傳遞,什么是值傳遞。
引用傳遞(pass by reference)是指在調(diào)用方法時(shí)將實(shí)際參數(shù)的地址直接傳遞到方法中,那么在方法中對參數(shù)所進(jìn)行的修改,將影響到實(shí)際參數(shù)。
值傳遞(pass by value)是指在調(diào)用方法時(shí)將實(shí)際參數(shù)拷貝一份傳遞到方法中,這樣在方法中如果對參數(shù)進(jìn)行修改,將不會(huì)影響到實(shí)際參數(shù)。
那在Java中到底是引用傳遞還是值傳遞呢?其實(shí)這個(gè)問題也一直是爭論不斷,而且官方也沒給個(gè)確切答案。但是就我個(gè)人理解,Java是值轉(zhuǎn)遞。
我們先來看一個(gè)簡單的例子:
public void test() { int a = 1; change(a); System.out.println("a的值:" + a); } private void change(int a) { a = a + 1; } // 輸出 a的值:1
在test()方法中定義了一個(gè)基本類型的變量a,然后調(diào)用change()方法試圖改變這個(gè)變量,最后輸出的還是原來的值。
首先我們要清楚,一個(gè)方法中的局部變量是存在棧中的,如果是基本類型的變量則直接存的是這個(gè)變量的值,如果是引用類型的變量則存的是值的地址,指向堆中具體的值。
上面的例子中,調(diào)用change()方法傳遞的a,其實(shí)是a變量的拷貝,不是真正的a,在change()方法中改變的是拷貝,對真正的a是沒有影響的。
這么一看,Java確實(shí)是值傳遞,但是我們再看下面這個(gè)例子,你就會(huì)糾結(jié)了
public void test() { User user = new User(); user.setAge(18); change(user); System.out.println("年齡:" + user.getAge()); } private void change(User user) { user.setAge(19); } // 輸出 年齡:19
看,對象里的屬性被改變了,不是值傳遞嗎,應(yīng)該不會(huì)改變啊,這時(shí)候就有人總結(jié)了,當(dāng)傳遞值是基本類型時(shí)是值傳遞、當(dāng)傳的是引用類型時(shí)是引用傳遞。真的是這樣嗎?
分析這個(gè)問題,我們需要知道變量在jvm中是怎么存儲(chǔ)的。
首先看基本類型,這個(gè)很簡單,變量在棧中直接存的是值,傳到change()方法的是這個(gè)變量的拷貝,因此對拷貝的變量修改不會(huì)影響原變量的值。
接著看引用類型,變量在棧中存儲(chǔ)的是引用地址,這個(gè)地址指向堆中具體的值,如下圖:
當(dāng)調(diào)用change()方法傳入變量時(shí),也是拷貝變量,但是這里的拷貝只是棧中的引用地址,并不會(huì)拷貝堆中的數(shù)據(jù),因此會(huì)變成下圖這樣:
雖然變量是拷貝,但是指向的地址是同一個(gè),因此對變量中的數(shù)據(jù)修改時(shí),還是會(huì)影響到原來真實(shí)的變量,但是,如果我們修改的是變量在棧中的地址,則不會(huì)影響原變量,例如下面這段代碼:
public void test() { User user = new User(); user.setAge(18); change(user); System.out.println("年齡:" + user.getAge()); } private void change(User user) { user = new User(); user.setAge(19); } // 輸出 年齡:18
這種是修改變量在棧中的地址,則不會(huì)影響原變量。
說到這里,大家差不多懂了,但是回頭看最開始的那個(gè)問題,傳入String類型的變量,String是引用類型,按道理,原變量是會(huì)被改變的呀,結(jié)果怎么是不變呢?
String變量比較特殊,我們看String的源碼可以知道,String的值是通過內(nèi)部的char[]數(shù)組來維護(hù)的,但是這個(gè)數(shù)據(jù)定義的是final類型的,因此,String的值是不可變的。我們平時(shí)修改String的值,其實(shí)是重新new了一個(gè)String對象,例如下面這段代碼:
String a = "hello"; a = "world";
這段代碼里,其實(shí)a變量并沒有被修改成world,只是重新new了一個(gè)String對象,這個(gè)對象的值是world,并把這個(gè)對象的引用地址賦給了a,原來的hello還是在堆中,只是這個(gè)值沒有被引用,過段時(shí)間會(huì)被gc垃圾回收。
String變量傳值在內(nèi)存中的變化如下圖:
String拷貝的是變量地址,但是它改變不了原String的值,因?yàn)镾tring是不可變的,所以在change()方法中是重新new了一個(gè)String對象,改變的是新對象的值,原變量是沒有影響的。
感謝各位的閱讀,以上就是“java是值傳遞嗎”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對java是值傳遞嗎這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!
當(dāng)前文章:java是值傳遞嗎
瀏覽地址:http://chinadenli.net/article40/goppho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、Google、App設(shè)計(jì)、云服務(wù)器、軟件開發(fā)、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)