Java傳參的三種情況_第1頁
Java傳參的三種情況_第2頁
Java傳參的三種情況_第3頁
Java傳參的三種情況_第4頁
Java傳參的三種情況_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

java傳值與傳引用的三種情況大家先看一個例子:publicclassExample{Stringstr=newString("good");char[]ch={'a','b','c'};publicstaticvoidmain(Stringargs[]){Exampleex=newExample();ex.change(ex.str,ex.ch);System.out.print(ex.st葉"and");System.out.print(ex.ch);}publicvoidchange(Stringstr,charch[]){str="testok";ch[0]='g';}}看看輸出結(jié)果? goodandgbcjava中沒有了c++中這樣的引用符號,也沒像c#中那樣提供了out與ref那么它是怎么做的呢做什么事情都要去除例外的東西,String類就是此類問題的一個特殊情況為什么特殊呢?因為它是一個引用類型,確執(zhí)行的是值傳遞。這樣說有些抽象,還是舉個例子吧值傳遞:classStr{publicstaticvoidmain(String[]args){inti=900;System.out.println(i);changelnt(i);System.Out.println(i);}publicstaticvoidchangelnt (ints){s=34234;}}結(jié)果:900900這就是所謂的值傳遞。i把自己的副本給了函數(shù)changeInt的形參,而在changeInt中雖然將s賦值34234。但是對原來的i值并沒有影響,因為它所修改的只是i的copy品而已。2222引用傳遞:classStr{publicstaticvoidmain(String[]args){Yinyongy=newYinyong();System.Out.println(y.age);changeObject(y);System.Out.println(y.age);}publicstaticvoidchangeObject (Yinyongobj){Obj.age=34234;}}classYinyong{intage=22;}聲明了個簡單的類Yinyong,當(dāng)把Yinyong的對象y傳遞給函數(shù)changeObject后,看下前后結(jié)果:34234值被改變了,這就是引用調(diào)用。下面再看看傳遞String對象會發(fā)生什么結(jié)果?classStr{publicstaticvoidmain (String[]args){Strings="javatest";System.Out.println(s);changeString(s);System.out.println(s);}publicstaticvoidchangeString (Stringstr){str="3ggoverright";}}看看結(jié)果吧:javatestjavatest你驚奇的發(fā)現(xiàn)s的值并沒有改變!你會問了,String不也是引用類型的嗎?怎么它的值沒有改變呢?因為是這樣的:String被設(shè)計為不可修改的類型,也就是對String對象的任何修改都將重新創(chuàng)建一個對象而放棄以前的內(nèi)存空間的引用!如上例:比如s指向0x2344,當(dāng)它賦值給str時str也同樣指向了0x2344。而當(dāng)執(zhí)行str="3ggoverright"后,str指向了別的地方。也許是0x2222或者其他,反正不是0x2344了。所以當(dāng)你輸出s的時候,它的值并沒有被修改!綜上所述:基本數(shù)據(jù)類型傳遞的是值的拷貝;對象類型傳遞的是引用的拷貝;而String類型傳遞的雖然也是對象,但它不同于一般的對象類型,它String被設(shè)計為不可修改的類型,也就是對String對象的任何修改都將重新創(chuàng)建一個對象而放棄以前的內(nèi)存空間的引用!按值傳遞還是按引用傳遞這個在Java里面是經(jīng)常被提起的問題,也有一些爭論,似乎最后還有一個所謂的結(jié)論:在Java里面參數(shù)傳遞都是按值傳遞”事實上,這很容易讓人迷惑,下面先分別看看什么是按值傳遞,什么是按引用傳遞,只要能正確理解,至于稱作按什么傳遞就不是個大問題了。:按值傳遞是什么指的是在方法調(diào)用時,傳遞的參數(shù)是按值的拷貝傳遞。示例如下:publicclassTempTest{privatevoidtest1(inta){//做點事情}publicstaticvoidmain(String[]args){TempTestt=newTempTest();inta=3;t.testl(a);//這里傳遞的參數(shù)a就是按值傳遞}}按值傳遞重要特點:傳遞的是值的拷貝,也就是說傳遞后就互不相關(guān)了。示例如下:publicclassTempTest{privatevoidtest1(inta){a=5;System.out.println("test1方法中的a==="+a);}publicstaticvoidmain(String[]args){TempTestt=newTempTest();inta=3;t.test1(a);〃傳遞后,test1方法對變量值的改變不影響這里的 aSystem.out.println( ”方法中的a===”+a);}}運行結(jié)果是:test1方法中的a===5main方法中的a===3:按引用傳遞是什么指的是在方法調(diào)用時,傳遞的參數(shù)是按引用進(jìn)行傳遞,其實傳遞的引用的地址,也就是變量所對應(yīng)的內(nèi)存空間的地址。示例如下:publicclassTempTest{privatevoidtest1(Aa){}publicstaticvoidmain(String[]args){TempTestt=newTempTest();Aa=newA();t.test1(a);//這里傳遞的參數(shù)a就是按引用傳遞}}classA{publicintage=0;}:按引用傳遞的重要特點傳遞的是值的引用,也就是說傳遞前和傳遞后都指向同一個引用 (也就是同一個內(nèi)存空間)。示例如下:第1行publicclassTempTest{第2行privatevoidtest1(Aa){第3行a.age=20;第4行System.out.println("test1方法中的age="+a.age);第5行}第6行publicstaticvoidmain(String[]args){第7行TempTestt=newTempTest();第8行Aa=newA();第9行a.age=10;第10行t.test1(a);第11行System.out.println(”方a法中的age=”+a.age);第12行}第13行}第14行classA{第15行publicintage=0;第16行}運行結(jié)果如下:test1方法中的age=20main方法中的age=20:理解按引用傳遞的過程一一內(nèi)存分配示意圖要想正確理解按引用傳遞的過程,就必須學(xué)會理解內(nèi)存分配的過程,內(nèi)存分配示意圖可以輔助我們?nèi)ダ斫膺@個過程。用上面的例子來進(jìn)行分析::運行開始,運行第8行,創(chuàng)建了一個A的實例,內(nèi)存分配示意如下:

main方法中ff]變壘a 這是一個A的實例眈時age-0?(2):運行第9行,是修改A實例里面的age的值,運行后內(nèi)存分配示意如下:這是一個A的實例main方法中的變量a ?此時age=iq.(3):運行第10行,是把main方法中的變量a所引用的內(nèi)存空間地址,按引用傳遞給testl方法中的a變量。請注意:這兩個a變量是完全不同的,不要被名稱相同所蒙蔽。這是一個A這是一個A的實例此時age=10;main育法中的變量狂—賦值給 (搜引用傳il)testl方法中的變量a由于是按引用傳遞,也就是傳遞的是內(nèi)存空間的地址,所以傳遞完成后形成的新的內(nèi)存示意圖如下:main方法中的變重amain方法中的變重atestl方法中的變量注這是一個A的實例此時age-10;也就是說:是兩個變量都指向同一個空間。:運行第3行,為testl方法中的變量a指向的A實例的age進(jìn)行賦值,完成后形成的新的內(nèi)存示意圖如下:這是一個A的實例testl壽法中的變重a—' W此時哽=20;此時A實例的age值的變化是由testl方法引起的:運行第4行,根據(jù)此時的內(nèi)存示意圖,輸出testl方法中的age=20:運行第11行,根據(jù)此時的內(nèi)存示意圖,輸出 main方法中的age=20:對上述例子的改變理解了上面的例子,可能有人會問,那么能不能讓按照引用傳遞的值,相互不影響呢?就是testl方法里面的修改不影響到main方法里面呢?方法是在testl方法里面新new—個實例就可以了。改變成下面的例子,其中第3行為新加的:第1行publicclassTempTest{第2行privatevoidtest1(Aa){第3行a=newA();〃新加的一行第4行a.age=20;第5行System.out.println("test1方法中的age="+a.age);第6行}第7行publicstaticvoidmain(String[]args){第8行TempTestt=newTempTest();第9行Aa=newA();第10行a.age=10;第11行t.test1(a);第12行System.out.println(”方a法中的age=”+a.age);第13行}第14行}

第15行classA{第16行publicintage=0;第17行}運行結(jié)果為:testl方法中的age=20main方法中的age=10為什么這次的運行結(jié)果和前面的例子不一樣呢,還是使用內(nèi)存示意圖來理解一下6:再次理解按引用傳遞(1):運行開始,運行第9行,創(chuàng)建了一個A的實例,內(nèi)存分配示意如下:main方法中的變量main方法中的變量a這是一個A的實例lit時age=0?(2):運行第10行,是修改A實例里面的age的值,運行后內(nèi)存分配示意如下:這是一個A的實例main方袪中的變量a 此時age=iq;(3):運行第11行,是把main方法中的變量a所引用的內(nèi)存空間地址,按引用傳遞給test1方法中的a變量。請注意:這兩個a變量是完全不同的,不要被名稱相同所蒙蔽。內(nèi)存分配示意如下:

main方法中的變量a 賦値給(按引用傳謹(jǐn))&testl方法中的變重a這是一個A的實例此時age=10這是一個A的實例此時age=10;testl方法中的變重耳■這是一個A的實例此時age=10;■main芳法中的變童a也就是說:是兩個變量都指向同一個空間。main方法中的變童(4):運行第3行,為testl方法中的變量a重新生成了新的Amain方法中的變童 」這夷的A的實例■UC時agp-0;testl方法中的變重3>這是一個嵐的實例age=10j(5):運行第4行,為testl方法中的變量a指向的新的A實例的age進(jìn)行賦值,完成后形成的新的內(nèi)存示意圖如下:注意:這個時候testl方法中的變量a的ag

溫馨提示

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

評論

0/150

提交評論