![JAVA傳值與傳引用_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/13/b78aa5ff-fcb1-461c-a3b7-254d754ac694/b78aa5ff-fcb1-461c-a3b7-254d754ac6941.gif)
![JAVA傳值與傳引用_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/13/b78aa5ff-fcb1-461c-a3b7-254d754ac694/b78aa5ff-fcb1-461c-a3b7-254d754ac6942.gif)
![JAVA傳值與傳引用_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/13/b78aa5ff-fcb1-461c-a3b7-254d754ac694/b78aa5ff-fcb1-461c-a3b7-254d754ac6943.gif)
![JAVA傳值與傳引用_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/13/b78aa5ff-fcb1-461c-a3b7-254d754ac694/b78aa5ff-fcb1-461c-a3b7-254d754ac6944.gif)
![JAVA傳值與傳引用_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/13/b78aa5ff-fcb1-461c-a3b7-254d754ac694/b78aa5ff-fcb1-461c-a3b7-254d754ac6945.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、例一:值傳遞:方法調(diào)用時(shí),實(shí)際參數(shù)把它的值傳遞給對(duì)應(yīng)的形式參數(shù),方法執(zhí)行中形式參數(shù)值的改變不影響實(shí)際參數(shù)的值。引用傳遞:也稱(chēng)為傳地址。方法調(diào)用時(shí),實(shí)際參數(shù)的引用(地址,而不是參數(shù)的值)被傳遞給方法中相對(duì)應(yīng)的形式參數(shù),在方法執(zhí)行中,對(duì)形式參數(shù)的操作實(shí)際上就是對(duì)實(shí)際參數(shù)的操作,方法執(zhí)行中形式參數(shù)值的改變將會(huì)影響實(shí)際參數(shù)的值。下面舉例說(shuō)明:傳值-傳遞基本數(shù)據(jù)類(lèi)型參數(shù)publicclassPassValuestatic void exchange(int a, int b)/靜態(tài)方法,交換a,b的值int temp;temp = a;a = b;b = temp;public static void
2、main(String args)int i = 10; int j = 100;System.out.println(before call: + i= + i + t + j = + j);/調(diào)用前exchange(i, j);/值傳遞,main方法只能調(diào)用靜態(tài)方法System.out.println(after call: + i= + i + t + j = + j);/調(diào)用后運(yùn)行結(jié)果:before call: i = 10j = 100aftercall: i = 10j = 100說(shuō)明:調(diào)用exchange(i, j)時(shí),實(shí)際參數(shù)i,j分別把值傳遞給相應(yīng)的形式參數(shù)a,b,在執(zhí)行方法
3、exchange()時(shí),形式參數(shù)a,b的值的改變不影響實(shí)際參數(shù)i和j的值,i和j的值在調(diào)用前后并沒(méi)改變。引用傳遞-對(duì)象作為參數(shù)如果在方法中把對(duì)象(或數(shù)組)作為參數(shù),方法調(diào)用時(shí),參數(shù)傳遞的是對(duì)象的引用(地址),即在方法調(diào)用時(shí),實(shí)際參數(shù)把對(duì)對(duì)象的引用(地址)傳遞給形式參數(shù)。這是實(shí)際參數(shù)與形式參數(shù)指向同一個(gè)地址,即同一個(gè)對(duì)象(數(shù)組),方法執(zhí)行時(shí),對(duì)形式參數(shù)的改變實(shí)際上就是對(duì)實(shí)際參數(shù)的改變,這個(gè)結(jié)果在調(diào)用結(jié)束后被保留了下來(lái)。class BookString name;private folat price;Book(String n,float )/構(gòu)造方法name = n;price = p;sta
4、ticvoid change(Book a_book,String n,float p)/靜態(tài)方法,對(duì)象作為參數(shù)a_ = n;a_book.price = p;public void output()/實(shí)例方法,輸出對(duì)象信息System.out.println(name: + name + t + price: + price);public class PassAddrpublic static void main(String args)Book b = new Book(java2,32.5f);System.out.print(before call:t);/調(diào)用前b
5、.output();b.change(b,c+,45.5f);/引用傳遞,傳遞對(duì)象b的引用,修改對(duì)象b的值System.out.print(after call:t);/調(diào)用后b.output();運(yùn)行結(jié)果:beforecall:name:java2price:32.5aftercall:name:c+price:45.5說(shuō)明:調(diào)用change(b,c+,45.5f)時(shí),對(duì)象b作為實(shí)際參數(shù),把引用傳遞給相應(yīng)的形式參數(shù)a_book,實(shí)際上a_book也指向同一個(gè)對(duì)象,即該對(duì)象有兩個(gè)引用名:b和a_book。在執(zhí)行方法change()時(shí),對(duì)形式參數(shù)a_book操作就是對(duì)實(shí)際參數(shù)b的操作。例二:1.
6、 簡(jiǎn)單類(lèi)型是按值傳遞的Java方法的參數(shù)是簡(jiǎn)單類(lèi)型的時(shí)候,是按值傳遞的 (pass by value)。這一點(diǎn)我們可以通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明:javaview plaincopyprint?1. /*例1*/2. /*3. *(#)Test.java4. *authorfancy5. */6. publicclassTest7. publicstaticvoidtest(booleantest)8. test=!test;9. System.out.println(Intest(boolean):test=+test);10. 11. publicstaticvoidmain(Stringa
7、rgs)12. booleantest=true;13. System.out.println(Beforetest(boolean):test=+test);14. test(test);15. System.out.println(Aftertest(boolean):test=+test);16. 17. 運(yùn)行結(jié)果:plainview plaincopyprint?1. Beforetest(boolean):test=true2. Intest(boolean):test=false3. Aftertest(boolean):test=true不難看出,雖然在 test(boolean
8、) 方法中改變了傳進(jìn)來(lái)的參數(shù)的值,但對(duì)這個(gè)參數(shù)源變量本身并沒(méi)有影響,即對(duì) main(String) 方法里的 test 變量沒(méi)有影響。那說(shuō)明,參數(shù)類(lèi)型是簡(jiǎn)單類(lèi)型的時(shí)候,是按值傳遞的。以參數(shù)形式傳遞簡(jiǎn)單類(lèi)型的變量時(shí),實(shí)際上是將參數(shù)的值作了一個(gè)拷貝傳進(jìn)方法函數(shù)的,那么在方法函數(shù)里再怎么改變其值,其結(jié)果都是只改變了拷貝的值,而不是源值。2. 什么是引用Java是傳值還是傳引用,問(wèn)題主要出在對(duì)象的傳遞上,因?yàn)?Java 中簡(jiǎn)單類(lèi)型沒(méi)有引用。既然爭(zhēng)論中提到了引用這個(gè)東西,為了搞清楚這個(gè)問(wèn)題,我們必須要知道引用是什么。簡(jiǎn)單的說(shuō),引用其實(shí)就像是一個(gè)對(duì)象的名字或者別名 (alias),一個(gè)對(duì)象在內(nèi)存中會(huì)請(qǐng)求一
9、塊空間來(lái)保存數(shù)據(jù),根據(jù)對(duì)象的大小,它可能需要占用的空間大小也不等。訪問(wèn)對(duì)象的時(shí)候,我們不會(huì)直接是訪問(wèn)對(duì)象在內(nèi)存中的數(shù)據(jù),而是通過(guò)引用去訪問(wèn)。引用也是一種數(shù)據(jù)類(lèi)型,我們可以把它想象為類(lèi)似 C 語(yǔ)言中指針的東西,它指示了對(duì)象在內(nèi)存中的地址只不過(guò)我們不能夠觀察到這個(gè)地址究竟是什么。如果我們定義了不止一個(gè)引用指向同一個(gè)對(duì)象,那么這些引用是不相同的,因?yàn)橐靡彩且环N數(shù)據(jù)類(lèi)型,需要一定的內(nèi)存空間來(lái)保存。但是它們的值是相同的,都指示同一個(gè)對(duì)象在內(nèi)存的中位置。比如javaview plaincopyprint?1. String a=Hello;2. Stringb=a;這里,a和 b 是不同的兩個(gè)引用,我們
10、使用了兩個(gè)定義語(yǔ)句來(lái)定義它們。但它們的值是一樣的,都指向同一個(gè)對(duì)象Hello。也許你還覺(jué)得不夠直觀,因?yàn)?String 對(duì)象的值本身是不可更改的 (像 b = World; b = a; 這種情況不是改變了 World 這一對(duì)象的值,而是改變了它的引用b 的值使之指向了另一個(gè) String 對(duì)象 a)。那么我們用 StringBuffer 來(lái)舉一個(gè)例子:javaview plaincopyprint?1. /*例2*/2. /*3. *(#)Test.java4. *authorfancy5. */6. publicclassTest7. publicstaticvoidmain(String
11、args)8. StringBuffera=new StringBuffer(Hello);9. StringBufferb=a;10. b.append(,World);11. System.out.println(ais+a);12. 13. 運(yùn)行結(jié)果:javaview plaincopyprint?1. a isHello,World這個(gè)例子中 a 和 b 都是引用,當(dāng)改變了 b 指示的對(duì)象的值的時(shí)候,從輸出結(jié)果來(lái)看,a 所指示的對(duì)象的值也改變了。所以,a 和b 都指向同一個(gè)對(duì)象即包含 Hello 的一個(gè) StringBuffer 對(duì)象。這里我描述了兩個(gè)要點(diǎn):1.引用是一種數(shù)據(jù)類(lèi)型,保存
12、了對(duì)象在內(nèi)存中的地址,這種類(lèi)型即不是我們平時(shí)所說(shuō)的簡(jiǎn)單數(shù)據(jù)類(lèi)型也不是類(lèi)實(shí)例(對(duì)象);2.不同的引用可能指向同一個(gè)對(duì)象,換句話說(shuō),一個(gè)對(duì)象可以有多個(gè)引用,即該類(lèi)類(lèi)型的變量。3. 對(duì)象是如何傳遞的呢關(guān)于對(duì)象的傳遞,有兩種說(shuō)法,即“它是按值傳遞的”和“它是按引用傳遞的”。這兩種說(shuō)法各有各的道理,但是它們都沒(méi)有從本質(zhì)上去分析,即致于產(chǎn)生了爭(zhēng)論。既然現(xiàn)在我們已經(jīng)知道了引用是什么東西,那么現(xiàn)在不妨來(lái)分析一下對(duì)象作是參數(shù)是如何傳遞的。還是先以一個(gè)程序?yàn)槔簀avaview plaincopyprint?1. /*例3*/2. /*3. *(#)Test.java4. *authorfancy5. */6.
13、publicclassTest7. publicstaticvoidtest(StringBufferstr)8. str.append(,World!);9. 10. publicstaticvoidmain(Stringargs)11. StringBufferstring=new StringBuffer(Hello);12. test(string);13. System.out.println(string);14. 15. 運(yùn)行結(jié)果:javaview plaincopyprint?1. Hello,World!test(string)調(diào)用了 test(StringBuffer) 方
14、法,并將 string 作為參數(shù)傳遞了進(jìn)去。這里 string 是一個(gè)引用,這一點(diǎn)是勿庸置疑的。前面提到,引用是一種數(shù)據(jù)類(lèi)型,而且不是對(duì)象,所以它不可能按引用傳遞,所以它是按值傳遞的,它么它的值究竟是什么呢?是對(duì)象的地址。由此可見(jiàn),對(duì)象作為參數(shù)的時(shí)候是按值傳遞的,對(duì)嗎?錯(cuò)!為什么錯(cuò),讓我們看另一個(gè)例子:javaview plaincopyprint?1. /*例4*/2. /*3. *(#)Test.java4. *authorfancy5. */6. publicclassTest7. publicstaticvoidtest(Stringstr)8. str=World;9. 10. pu
15、blicstaticvoidmain(Stringargs)11. Stringstring=Hello;12. test(string);13. System.out.println(string);14. 15. 運(yùn)行結(jié)果:plainview plaincopyprint?1. Hello為什么會(huì)這樣呢?因?yàn)閰?shù) str 是一個(gè)引用,而且它與 string 是不同的引用,雖然它們都是同一個(gè)對(duì)象的引用。str= World 則改變了 str 的值,使之指向了另一個(gè)對(duì)象,然而 str 指向的對(duì)象改變了,但它并沒(méi)有對(duì) Hello 造成任何影響,而且由于 string 和 str 是不同的引用,s
16、tr 的改變也沒(méi)有對(duì) string 造成任何影響,結(jié)果就如例中所示。其結(jié)果是推翻了參數(shù)按值傳遞的說(shuō)法。那么,對(duì)象作為參數(shù)的時(shí)候是按引用傳遞的了?也錯(cuò)!因?yàn)樯弦粋€(gè)例子的確能夠說(shuō)明它是按值傳遞的。結(jié)果,就像光到底是波還是粒子的問(wèn)題一樣,Java 方法的參數(shù)是按什么傳遞的問(wèn)題,其答案就只能是:即是按值傳遞也是按引用傳遞,只是參照物不同,結(jié)果也就不同。4. 正確看待傳值還是傳引用的問(wèn)題要正確的看待這個(gè)問(wèn)題必須要搞清楚為什么會(huì)有這樣一個(gè)問(wèn)題。實(shí)際上,問(wèn)題來(lái)源于 C,而不是 Java。C語(yǔ)言中有一種數(shù)據(jù)類(lèi)型叫做指針,于是將一個(gè)數(shù)據(jù)作為參數(shù)傳遞給某個(gè)函數(shù)的時(shí)候,就有兩種方式:傳值,或是傳指針,它們的區(qū)別,可
17、以用一個(gè)簡(jiǎn)單的例子說(shuō)明:javaview plaincopyprint?1. /*例5*/2. /*3. *(#)test.c4. *authorfancy5. */6. voidSwapValue(inta,intb)7. intt=a;8. a=b;9. b=t;10. 11. voidSwapPointer(int*a,int*b)12. intt=*a;13. *a=*b;14. *b=t;15. 16. voidmain()17. inta=0,b=1;18. printf(1:a=%d,b=%d/n,a,b);19. SwapValue(a,b);20. printf(2:a=%d
18、,b=%d/n,a,b);21. SwapPointer(&a,&b);22. printf(3:a=%d,b=%d/n,a,b);23. 運(yùn)行結(jié)果:plainview plaincopyprint?1. 1:a=0,b=12. 2:a=0,b=13. 3:a=1,b=0大家可以明顯的看到,按指針傳遞參數(shù)可以方便的修改通過(guò)參數(shù)傳遞進(jìn)來(lái)的值,而按值傳遞就不行。當(dāng)Java 成長(zhǎng)起來(lái)的時(shí)候,許多的 C 程序員開(kāi)始轉(zhuǎn)向?qū)W習(xí) Java,他們發(fā)現(xiàn),使用類(lèi)似 SwapValue 的方法仍然不能改變通過(guò)參數(shù)傳遞進(jìn)來(lái)的簡(jiǎn)單數(shù)據(jù)類(lèi)型的值,但是如果是一個(gè)對(duì)象,則可能將其成員隨意更改。于是他們覺(jué)得這很像是 C 語(yǔ)言中
19、傳值/傳指針的問(wèn)題。但是 Java 中沒(méi)有指針,那么這個(gè)問(wèn)題就演變成了傳值/傳引用的問(wèn)題??上⑦@個(gè)問(wèn)題放在 Java 中進(jìn)行討論并不恰當(dāng)。討論這樣一個(gè)問(wèn)題的最終目的只是為了搞清楚何種情況才能在方法函數(shù)中方便的更改參數(shù)的值并使之長(zhǎng)期有效。Java中,改變參數(shù)的值有兩種情況,第一種,使用賦值號(hào)“=”直接進(jìn)行賦值使其改變,如例 1 和例4;第二種,對(duì)于某些對(duì)象的引用,通過(guò)一定途徑對(duì)其成員數(shù)據(jù)進(jìn)行改變,如例 3。對(duì)于第一種情況,其改變不會(huì)影響到方法該方法以外的數(shù)據(jù),或者直接說(shuō)源數(shù)據(jù)。而第二種方法,則相反,會(huì)影響到源數(shù)據(jù)因?yàn)橐弥甘镜膶?duì)象沒(méi)有變,對(duì)其成員數(shù)據(jù)進(jìn)行改變則實(shí)質(zhì)上是改變的該對(duì)象。5. 如何實(shí)現(xiàn)類(lèi)似 swap 的方法傳值還是傳引用的問(wèn)題,到此已經(jīng)算是解決了,但是我們?nèi)匀徊荒芙鉀Q這樣一個(gè)問(wèn)題:如果我有兩個(gè) int 型的變量 a 和 b,我想寫(xiě)一個(gè)方法來(lái)交換它們的值,應(yīng)該怎么辦?結(jié)論很讓人失望沒(méi)有辦法!因此,我們只能具體情況具體討論,以經(jīng)常使用交換方法的排序?yàn)槔簀avaview plaincopyprint?1. /*例6*/2. /*3.
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 共同購(gòu)房合同范本
- 公寓酒店轉(zhuǎn)讓合同范本
- 中介委托房屋合同范本
- 鄉(xiāng)村道路護(hù)欄加工合同范本
- 供應(yīng)材料解除合同范本
- 寫(xiě)場(chǎng)地出租合同范本
- 買(mǎi)墓地協(xié)議書(shū)合同范本
- 勞務(wù)合同由誰(shuí)簽定合同范本
- 個(gè)人貨品售賣(mài)合同范例
- 業(yè)務(wù)保理合同范本
- 《游戲界面設(shè)計(jì)專(zhuān)題實(shí)踐》課件-知識(shí)點(diǎn)5:圖標(biāo)繪制準(zhǔn)備與繪制步驟
- 自動(dòng)扶梯安裝過(guò)程記錄
- 智慧供熱管理系統(tǒng)方案可行性研究報(bào)告
- 帕金森病的言語(yǔ)康復(fù)治療
- 中國(guó)城市居民的健康意識(shí)和生活方式調(diào)研分析報(bào)告
- 上海星巴克員工手冊(cè)
- 統(tǒng)編版小學(xué)語(yǔ)文五年級(jí)下冊(cè)第四單元解讀與大單元設(shè)計(jì)思路
- 貓狗創(chuàng)業(yè)計(jì)劃書(shū)
- 復(fù)產(chǎn)復(fù)工試題含答案
- 部編版語(yǔ)文三年級(jí)下冊(cè)第六單元大單元整體作業(yè)設(shè)計(jì)
- 售后服務(wù)經(jīng)理的競(jìng)聘演講
評(píng)論
0/150
提交評(píng)論