Java方法的參數(shù)傳遞_第1頁
Java方法的參數(shù)傳遞_第2頁
Java方法的參數(shù)傳遞_第3頁
Java方法的參數(shù)傳遞_第4頁
Java方法的參數(shù)傳遞_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Java方法的參數(shù)傳遞(二非“不可變對象”的引用變量作為參數(shù)Java對于引用類型的參數(shù)傳遞,與8種基本數(shù)據(jù)類型的參數(shù)傳遞不同。對于基本數(shù)據(jù)類型的數(shù)據(jù)作為方法參數(shù),是按值傳遞(passing by value,即將實參變量所指向的棧內(nèi)存臨時存儲區(qū)所存儲數(shù)據(jù)(即實參變量的值進(jìn)行復(fù)制,然后傳遞給形參變量首先,要弄明白兩個不同的概念:對象,引用變量。對象是類的實例,存儲位置位于“堆”(Heap中。引用變量是存放對應(yīng)“對象”存儲區(qū)之首地址的變量,存儲位置位于“?!敝?。因此,百味峰爺認(rèn)為所謂以“對象”作為Java方法參數(shù)的說法不準(zhǔn)確,更為準(zhǔn)確的描述應(yīng)該是“引用變量作為Java方法參數(shù)”。一、理論分析Jav

2、a類中方法以“引用變量”作為形參,形參和實參在棧內(nèi)存中都有各自獨(dú)立的存儲區(qū)。參數(shù)傳遞時,將“引用變量”實參的存儲區(qū)中所存儲數(shù)據(jù)(實參值進(jìn)行復(fù)制,“復(fù)制值”存入“引用變量”形參的存儲區(qū)。因為“實參值”是特定“對象”在堆內(nèi)存中存儲的首地址,所以參數(shù)傳遞操作使得形參和實參一樣成為該“對象”的引用變量,即指向相同的堆內(nèi)存區(qū)。二、例證說明范例程序ParameterPassingDemo02.java的源代碼:class Demo int temp;public class ParameterPassingDemo02public static void main(String args Demo act

3、ualParameter= new Demo(;actualParameter.temp =80;System.out.println("fun(調(diào)用前實參actualParameter的值:" + actualParameter.temp;fun(actualParameter;/引用變量作為實參System.out.println("fun(調(diào)用后實參actualParameter的值:" + actualParameter.temp;public static void fun(Demo formalParameter /引用變量作為形參forma

4、lParameter.temp = 888;運(yùn)行結(jié)果為: 三、分析 從以上分析可以看出,實參actualParameter 并未發(fā)生改變,改變的是其引用的對象new Demo(。實參actualParameter 是“以不變應(yīng)萬變”,以自身的不變來應(yīng)付所引用對象new Demo(的萬變。四、對于“引用變量”作為方法參數(shù),實參是否都能夠“以不變應(yīng)萬變”?答案:否!接下來,百味峰爺試著做出如下的分析。編程過程中,有時候需要禁止某個“對象”被改動內(nèi)容。為此,Java 提供了Immutable 類(譬如String 類,該類的對象被稱為“不可變對象”。根據(jù)定義,“不可變對象”是一種一旦構(gòu)建好就不再變化

5、的“對象”,在其生存期間不可被改變內(nèi)容。對于這類對象,實參仍然不會發(fā)生變化,但是它所引用的對象也沒有變化,因此談不上“以不變應(yīng)萬變”,而是“不變”應(yīng)“不變”。那么變化的是誰呢?百味峰爺計劃在Java 方法的參數(shù)傳遞(三再行總結(jié)。actualParameter Temp=0Demo actualParameter= new Demo(; actualParameterTemp=80 actualParameter.temp =80;actualParameter formalParameterTemp=888 fun(actualParameter; actualParameter Temp=8

6、88執(zhí)行并退出fun(方法后,formalParameter 所分配棧內(nèi)存空間被釋放。五、引用變量作為參數(shù),參數(shù)傳遞究竟是“按值傳遞”,還是“按地址傳遞”?百味峰爺在學(xué)習(xí)c和Vb的時候都遇到過“按值傳遞”和“按地址傳遞”的參數(shù)傳遞方式,很糾結(jié)Java中“引用變量”的參數(shù)傳遞方式。在網(wǎng)上搜索了很多資料,都沒有滿意的答案。一種答案簡單粗暴:Java中所有的參數(shù)只能“按值傳遞”;相比較而言,另一種說法更容易接受:站在傳遞的是實參的復(fù)制值這個角度看,是“按值傳遞”;站在傳遞的是對象的地址這個角度看,是“按地址傳遞”。但是,愛較真的百味峰爺還是不滿意!因此,回味了一下C語言和Vb中的參數(shù)傳遞方式。在C語

7、言和Vb中,函數(shù)參數(shù)傳遞分為“按值傳遞”和“按地址傳遞”。以C語言為例,實參擁有兩種可用來傳遞的“資源”:一是分配給實參的棧內(nèi)存存儲區(qū)地址,簡稱實參地址;二是實參的存儲區(qū)中所存放的值,簡稱實參值。假設(shè)某個實參a的實參地址為FFE0,而該 存儲區(qū)中存放的實參值為200 ,則示意圖如下:如果是“按值傳遞”,則實參a傳送給形參的是其實參值的復(fù)制值,即200;如果是“按地址傳遞”,則實參a傳送給形參的是其實參地址,即FFE0。C語言中的“按值傳遞”/*定義函數(shù)func */func(int aa=10; /*讓形參數(shù)a等于10 */void main(Int b =5; /*初始化b值為5*/func

8、(b; /*調(diào)用函數(shù)func,實參b值5的復(fù)制賦給形參 a*/ printf("%d",b; /*輸出b的結(jié)果*/getch(;運(yùn)行結(jié)果為:分析:200FFE05FFE0Int b =5;5FFEAfunc(b; 可見,在“按值傳遞”過程中,無論形參如何變化,對應(yīng)的實參都能“毫發(fā)無損”,因為形參得到的只是實參值的復(fù)制品。實參給了形參這個“復(fù)制品”后,就全身而退,讓形參自個兒去玩。 C 語言中的“按地址傳遞”(適用于指針變量/*定義函數(shù)func */func(int *a*a=10; /*讓形參a 指向的存儲區(qū)存放值為10 */void main(int b =5; /*初始

9、化b 值為5*/func(&b; /*調(diào)用函數(shù)func ,實參b 的實參地址FFF0賦給形參a*/printf("%d",b; /*輸出b 的結(jié)果 */getch(;運(yùn)行結(jié)果為: 分析: 10 FFEAa=10; 5 FFE0int b =5; /*初始化b 值為5*/ FFE0 FFEA func(&b; /*調(diào)用函數(shù)func ,實參b 的實參地址FFF0賦給形參a*/ 5 FFE0 可見,在“按地址傳遞”過程中,實參將自己的地址(實參地址傳遞給形參,指針形參就指向了實參的存儲區(qū)域,從而實參和形參捆綁在一起,造成“一榮俱榮,一損俱損”的局面。直到形參死掉后

10、(形參所在函數(shù)執(zhí)行結(jié)束,實參才能重獲“獨(dú)立”。書歸正傳!在分析了C 語言中的“按值傳遞”和“按地址傳遞”后,與Java 中“引用變量”的參數(shù)傳遞相比較,發(fā)現(xiàn)后者與前者的兩種情況都有所不同。Java 中“引用變量”的參數(shù)傳遞與C 語言中的“按值傳遞”相比較:雖然實參傳遞給形參的都是各自存儲區(qū)中值的復(fù)制品,但是前者的值本質(zhì)上是“地址”,當(dāng)對應(yīng)形參獲得該“地址”,就和實參指向同一個存儲區(qū)。因此,Java 中“引用變量”的參數(shù)傳遞不屬于傳統(tǒng)意義上的“按值傳遞”。Java 中“引用變量”的參數(shù)傳遞與C 語言中的“按地址傳遞”相比較:雖然傳遞的都是“地址”,但是前者傳遞的是“第三者”(對象的地址,后者傳遞的是“自己”(實參的地址。因此,前者形參、實參同時指向“第三者”(對象,是三角關(guān)系;而后者是形參指向?qū)崊?是在二

溫馨提示

  • 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

提交評論