值傳遞和引用傳遞_第1頁(yè)
值傳遞和引用傳遞_第2頁(yè)
值傳遞和引用傳遞_第3頁(yè)
值傳遞和引用傳遞_第4頁(yè)
值傳遞和引用傳遞_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

本文格式為Word版,下載可任意編輯——值傳遞和引用傳遞值傳遞:(形式參數(shù)類(lèi)型是基本數(shù)據(jù)類(lèi)型):方法調(diào)用時(shí),實(shí)際參數(shù)把它的值傳遞給對(duì)應(yīng)的形式參數(shù),形式參數(shù)只是用實(shí)際參數(shù)的值初始化自己的存儲(chǔ)單元內(nèi)容,是兩個(gè)不同的存儲(chǔ)單元,所以方法執(zhí)行中形式參數(shù)值的改變不影響實(shí)際參數(shù)的值。

引用傳遞:(形式參數(shù)類(lèi)型是引用數(shù)據(jù)類(lèi)型參數(shù)):也稱(chēng)為傳地址。方法調(diào)用時(shí),實(shí)際參數(shù)是對(duì)象(或數(shù)組),這時(shí)實(shí)際參數(shù)與形式參數(shù)指向同一個(gè)地址,在方法執(zhí)行中,對(duì)形式參數(shù)的操作實(shí)際上就是對(duì)實(shí)際參數(shù)的操作,這個(gè)結(jié)果在方法終止后被保存了下來(lái),所以方法執(zhí)行中形式參數(shù)的改變將會(huì)影響實(shí)際參數(shù)。

Java:按值傳遞還是按引用傳遞詳細(xì)講解

前天在做系統(tǒng)的時(shí)候被Java中參數(shù)傳遞問(wèn)題卡了一下,回頭查閱了相關(guān)的資料,對(duì)參數(shù)傳遞問(wèn)題有了新的了解和把握,但是有個(gè)問(wèn)題感覺(jué)還是很模糊,就是Java中終究是否只存在值傳遞,由于在查閱資料時(shí),經(jīng)??吹接腥苏f(shuō)Java只有值傳遞,但有人說(shuō)既有值傳遞,也有引用傳遞,對(duì)于兩個(gè)觀(guān)點(diǎn)個(gè)人覺(jué)得應(yīng)當(dāng)是站的角度不同而得出兩個(gè)不同的說(shuō)法,其實(shí)兩個(gè)說(shuō)法其中的原理是一樣的,只要咱們懂得其中的原理,那么至于叫什么也就無(wú)所謂了,下面是我在網(wǎng)上看到的一個(gè)帖子,解釋的感覺(jué)挺全面,就轉(zhuǎn)過(guò)來(lái),以供以后學(xué)習(xí)參考:

1:按值傳遞是什么

指的是在方法調(diào)用時(shí),傳遞的參數(shù)是按值的拷貝傳遞。例如如下:

[java]viewplaincopy

1.2.3.4.5.6.7.8.9.publicclassTempTest{privatevoidtest1(inta){//做點(diǎn)事情}publicstaticvoidmain(String[]args){TempTestt=newTempTest();inta=3;t.test1(a);//這里傳遞的參數(shù)a就是按值傳遞}10.}

按值傳遞重要特點(diǎn):傳遞的是值的拷貝,也就是說(shuō)傳遞后就互不相關(guān)了。例如如下:

[java]viewplaincopy

1.2.3.4.5.6.7.8.9.publicclassTempTest{privatevoidtest1(inta){a=5;System.out.println(\方法中的a=\+a);}publicstaticvoidmain(String[]args){TempTestt=newTempTest();inta=3;t.test1(a);//傳遞后,test1方法對(duì)變量值的改變不影響這里的a10.System.out.println(〞main方法中的a=〞+a);11.}12.}運(yùn)行結(jié)果是:

[java]viewplaincopy

1.2.test1方法中的a=5main方法中的a=3

2:按引用傳遞是什么

指的是在方法調(diào)用時(shí),傳遞的參數(shù)是按引用進(jìn)行傳遞,其實(shí)傳遞的引用的地址,也就是變量所對(duì)應(yīng)的內(nèi)存空間的地址。例如如下:

[java]viewplaincopy

1.2.3.4.5.6.7.8.9.publicclassTempTest{privatevoidtest1(Aa){}publicstaticvoidmain(String[]args){TempTestt=newTempTest();Aa=newA();t.test1(a);//這里傳遞的參數(shù)a就是按引用傳遞}}10.classA{11.publicintage=0;12.}

3:按引用傳遞的重要特點(diǎn)

傳遞的是值的引用,也就是說(shuō)傳遞前和傳遞后都指向同一個(gè)引用(也就是同一個(gè)內(nèi)存空間)。例如如下:

[java]viewplaincopy

1.2.3.4.5.6.7.8.9.publicclassTempTest{privatevoidtest1(Aa){a.age=20;System.out.println(\方法中的age=\+a.age);//20}publicstaticvoidmain(String[]args){TempTestt=newTempTest();Aa=newA();//age=0a.age=10;10.t.test1(a);11.System.out.println(〞main方法中的age=〞+a.age);12.}13.}14.classA{15.publicintage=0;16.}運(yùn)行結(jié)果如下:

[java]viewplaincopy

1.2.test1方法中的age=20main方法中的age=20

4:理解按引用傳遞的過(guò)程——內(nèi)存分派示意圖

要想正確理解按引用傳遞的過(guò)程,就必需學(xué)會(huì)理解內(nèi)存分派的過(guò)程,內(nèi)存分派示意圖可以輔助我們?nèi)ダ斫膺@個(gè)過(guò)程。用上面的例子來(lái)進(jìn)行分析:

(1):運(yùn)行開(kāi)始,運(yùn)行第8行,創(chuàng)立了一個(gè)A的實(shí)例,內(nèi)存分派示意如下:

(2):運(yùn)行第9行,是修改A實(shí)例里面的age的值,運(yùn)行后內(nèi)存分派示意如下:

(3):運(yùn)行第10行,是把main方法中的變量a所引用的內(nèi)存空間地址,按引用傳遞給test1方法中的a變量。請(qǐng)注意:這兩個(gè)a變量是完全不同的,不要被名稱(chēng)一致所蒙蔽。內(nèi)存分派示意如下:

由于是按引用傳遞,也就是傳遞的是內(nèi)存空間的地址,所以傳遞完成后形成的新的內(nèi)存示意圖如下:

也就是說(shuō):是兩個(gè)變量都指向同一個(gè)空間。

(4):運(yùn)行第3行,為test1方法中的變量a指向的A實(shí)例的age進(jìn)行賦值,完成后形成的新的內(nèi)存示意圖如下:

此時(shí)A實(shí)例的age值的變化是由test1方法引起的

(5):運(yùn)行第4行,根據(jù)此時(shí)的內(nèi)存示意圖,輸出test1方法中的age=20(6):運(yùn)行第11行,根據(jù)此時(shí)的內(nèi)存示意圖,輸出main方法中的age=20

5:對(duì)上述例子的改變

理解了上面的例子,可能有人會(huì)問(wèn),那么能不能讓依照引用傳遞的值,相互不影響呢?就是test1方法里面的修改不影響到main方法里面呢?

方法是在test1方法里面新new一個(gè)實(shí)例就可以了。改變成下面的例子,其中第3行為新加的:

[java]viewplaincopy

1.2.3.4.5.6.7.8.9.publicclassTempTest{privatevoidtest1(Aa){a=newA();//新加的一行在內(nèi)存中又分派了一個(gè)地址a.age=20;System.out.println(\方法中的age=\+a.age);}publicstaticvoidmain(String[]args){TempTestt=newTempTest();Aa=newA();10.a.age=10;11.t.

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論