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

下載本文檔

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

文檔簡介

Java代碼publicclassParamTest{//初始值為0protectedintnum=0;//為方法參數(shù)重新賦值publicvoidchange(inti){i=5;//不能改變}//為方法參數(shù)重新賦值publicvoidchange(ParamTestt){ParamTesttmp=newParamTest();tmp.num=9;t=tmp;//不能改變}//改變方法參數(shù)的值publicvoidadd(inti){i+=10;//不能改變}//改變方法參數(shù)屬性的值publicvoidadd(ParamTestpt){pt.num+=20;//改變}publicstaticvoidmain(String[]args){ParamTestt=newParamTest();System.out.println("參數(shù)--基本類型");System.out.println("原有的值:"+t.num);//為基本類型參數(shù)重新賦值t.change(t.num);System.out.println("賦值之后:"+t.num);//為引用型參數(shù)重新賦值t.change(t);System.out.println("運算之后:"+t.num);System.out.println();t=newParamTest();System.out.println("參數(shù)--引用類型");System.out.println("原有的值:"+t.num);//改變基本類型參數(shù)的值t.add(t.num);System.out.println("賦引用后:"+t.num);//改變引用類型參數(shù)所指向?qū)ο蟮膶傩灾祎.add(t);System.out.println("改屬性后:"+t.num);}}這段代碼的運行結(jié)果如下:參數(shù)--基本類型原有的值:0賦值之后:0運算之后:0參數(shù)--引用類型原有的值:0賦引用后:0改屬性后:20從上面這個直觀的結(jié)果中我們很容易得出如下結(jié)論:對于基本類型,在方法體內(nèi)對方法參數(shù)進行重新賦值,并不會改變原有變量的值。對于引用類型,在方法體內(nèi)對方法參數(shù)進行重新賦予引用,并不會改變原有變量所持有的引用。方法體內(nèi)對參數(shù)進行運算,不影響原有變量的值。方法體內(nèi)對參數(shù)所指向?qū)ο蟮膶傩赃M行運算,將改變原有變量所指向?qū)ο蟮膶傩灾怠I厦婵偨Y(jié)出來的不過是我們所看到的表面現(xiàn)象。那么,為什么會出現(xiàn)這樣的現(xiàn)象呢?這就要說到值傳遞和引用傳遞的概念了。這個問題向來是頗有爭議的。大家都知道,在JAVA中變量有以下兩種:基本類型變量,包括char、byte、short、int、long、float、doubleboolean引用類型變量,包括類、接口、數(shù)組(基本類型數(shù)組和對象數(shù)組)。當基本類型的變量被當作參數(shù)傳遞給方法時,JAVA虛擬機所做的工作是把這個值拷貝了一份,然后把拷貝后的值傳遞到了方法的內(nèi)部。因此在上面的例子中,我們回頭來看看這個方法:Java代碼//為方法參數(shù)重新賦值publicvoidchange(inti){i=5;}Java代碼//為方法參數(shù)重新賦值publicvoidchange(inti){i=5;}//為方法參數(shù)重新賦值publicvoidchange(inti){i=5;}在這個方法被調(diào)用時,變量i和ParamTest型對象t的屬性num具有相同的值,卻是兩個不同變量。變量i是由JAVA虛擬機創(chuàng)建的作用域在change(inti)方法內(nèi)的局部變量,在這個方法執(zhí)行完畢后,它的生命周期就結(jié)束了。在JAVA虛擬機中,它們是以類似如下的方式存儲的:很明顯,在基本類型被作為參數(shù)傳遞給方式時,是值傳遞,在整個過程中根本沒有牽扯到引用這個概念。這也是大家所公認的。對于布爾型變量當然也是如此,請看下面的例子:Java代碼publicclassBooleanTest{//布爾型值booleanbool=true;//為布爾型參數(shù)重新賦值publicvoidchange(booleanb){b=false;}//對布爾型參數(shù)進行運算publicvoidcalculate(booleanb){}}b=b&&false;//為了方便對比,將運算結(jié)果輸出System.out.println("b運算后的值:"+b);}publicstaticvoidmain(String[]args){BooleanTestt=newBooleanTest();System.out.println(”參數(shù)--布爾型”);System.out.println(”原有的值:"+t.bool);//為布爾型參數(shù)重新賦值t.change(t.bool);System.out.println(”賦值之后:"+t.bool);//改變布爾型參數(shù)的值t.calculate(t.bool);System.out.println(”運算之后:"+t.bool);}}Java代碼publicclassBooleanTest{//布爾型值booleanbool=true;//為布爾型參數(shù)重新賦值publicvoidchange(booleanb){b=false;//對布爾型參數(shù)進行運算publicvoidcalculate(booleanb){b=b&&false;//為了方便對比,將運算結(jié)果輸出System.out.println("b運算后的值:"+b);}publicstaticvoidmain(String[]args){BooleanTestt=newBooleanTest();System.out.println(”參數(shù)--布爾型");System.out.println(”原有的值:"+t.bool);//為布爾型參數(shù)重新賦值t.change(t.bool);System.out.println(”賦值之后:"+t.bool);//改變布爾型參數(shù)的值t.calculate(t.bool);System.out.println(”運算之后:"+t.bool);}}輸出結(jié)果如下:參數(shù)--布爾型原有的值:true賦值之后:trueb運算后的值:false運算之后:true那么當引用型變量被當作參數(shù)傳遞給方法時JAVA虛擬機又是怎樣處理的呢?同樣,它會拷貝一份這個變量所持有的引用,然后把它傳遞給JAVA虛擬機為方法創(chuàng)建的局部變量,從而這兩個變量指向了同一個對象。在篇首所舉的示例中,ParamTest類型變量t和局部變量pt在JAVA虛擬機中是以如下的方式存儲的:有一種說法是當一個對象或引用類型變量被當作參數(shù)傳遞時, 也是值傳遞,這個值就是對象的引用,因此JAVA中只有值傳遞,沒有引用傳遞。還有一種說法是引用可以看作是對象的別名,當對象被當作參數(shù)傳遞給方法時,傳遞的是對象的引用,因此是引用傳遞。這兩種觀點各有支持者,但是前一種觀點被絕大多數(shù)人所接受,其中有《CoreJava〉一書的作者,以及JAVA的創(chuàng)造者JamesGosling而《ThinkinginJava》一書的作者BruceEckel則站在了中立的立場上。我個人認為值傳遞中的值指的是基本類型的數(shù)值, 即使對于布爾型,雖然它的表現(xiàn)形式為true和false,但是在棧中,它仍然是以數(shù)值形式保存的,即0表示false,其它數(shù)值表示true。而引用是我們用來操作對象的工具,它包含了對象在堆中保存地址的信息。即使在被作為參數(shù)傳遞給方法時,實際上傳遞的是它的拷貝,但那仍是引用。因此,用引用傳遞來區(qū)別與值傳遞,概念上更加清晰。最后我們得出如下的

溫馨提示

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

評論

0/150

提交評論