java按值傳遞還是按引用傳遞詳細(xì)解說_第1頁
java按值傳遞還是按引用傳遞詳細(xì)解說_第2頁
java按值傳遞還是按引用傳遞詳細(xì)解說_第3頁
java按值傳遞還是按引用傳遞詳細(xì)解說_第4頁
java按值傳遞還是按引用傳遞詳細(xì)解說_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、java按值傳遞還是按引用傳遞詳細(xì)解說按值傳遞還是按引用傳遞作者:陳臣 發(fā)布于:2008年10月22日 21:25 這個(gè)在Java里面是經(jīng)常被提起的問題,也有一些爭(zhēng)論,似乎最后還有一個(gè)所謂的結(jié)論:“在Java里面參數(shù)傳遞都是按值傳遞”。事實(shí)上,這很容易讓人迷惑,下面先分別看看什么是按值傳遞,什么是按引用傳遞,只要能正確理解,至于稱作按什么傳遞就不是個(gè)大問題了。1:按值傳遞是什么指的是在方法調(diào)用時(shí),傳遞的參數(shù)是按值的拷貝傳遞。示例如下:public class TempTest private void test1(int a)/做點(diǎn)事情public static void main(Strin

2、g args) TempTest t = new TempTest();int a = 3;t.test1(a);/這里傳遞的參數(shù)a就是按值傳遞按值傳遞重要特點(diǎn):傳遞的是值的拷貝,也就是說傳遞后就互不相關(guān)了。示例如下:public class TempTest private void test1(int a)a = 5;方法中的a=+a);public static void main(String args) TempTest t = new TempTest();int a = 3;t.test1(a);/傳遞后,test1方法對(duì)變量值的改變不影響這里的a方法中的a=”+a);運(yùn)行結(jié)果是

3、:test1方法中的a=5main方法中的a=32:按引用傳遞是什么指的是在方法調(diào)用時(shí),傳遞的參數(shù)是按引用進(jìn)行傳遞,其實(shí)傳遞的引用的地址,也就是變量所對(duì)應(yīng)的內(nèi)存空間的地址。示例如下:public class TempTest private void test1(A a)public static void main(String args) TempTest t = new TempTest();A a = new A();t.test1(a); /這里傳遞的參數(shù)a就是按引用傳遞class Apublic int age = 0;3:按引用傳遞的重要特點(diǎn)傳遞的是值的引用,也就是說傳遞前和傳遞

4、后都指向同一個(gè)引用(也就是同一個(gè)內(nèi)存空間)。示例如下:第1行 public class TempTest 第2行 private void test1(A a)第3行 a.age = 20;第4行方法中的age=+a.age);第5行 第6行 public static void main(String args) 第7行 TempTest t = new TempTest();第8行 A a = new A();第9行 a.age = 10;第10行 t.test1(a);第11行方法中的age=”+a.age);第12行 第13行 第14行 class A第15行 public int a

5、ge = 0;第16行 運(yùn)行結(jié)果如下:test1方法中的age=20main方法中的age=204:理解按引用傳遞的過程內(nèi)存分配示意圖要想正確理解按引用傳遞的過程,就必須學(xué)會(huì)理解內(nèi)存分配的過程,內(nèi)存分配示意圖可以輔助我們?nèi)ダ斫膺@個(gè)過程。用上面的例子來進(jìn)行分析:(1):運(yùn)行開始,運(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變量是完全不同的,不要被名稱相同所蒙蔽。內(nèi)存分配示意如下:由于是按引用傳遞

6、,也就是傳遞的是內(nèi)存空間的地址,所以傳遞完成后形成的新的內(nèi)存示意圖如下:也就是說:是兩個(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=205:對(duì)上述例子的改變理解了上面的例子,可能有人會(huì)問,那么能不能讓按照引用傳遞的值,相互不影響呢?就是test1方法里面的修改不影響到main方法里面呢?方法是在test1方法里面新

7、new一個(gè)實(shí)例就可以了。改變成下面的例子,其中第3行為新加的:第1行 public class TempTest 第2行 private void test1(A a)第3行 a = new A();/新加的一行第4行 a.age = 20;第5行方法中的age=+a.age);第6行 第7行 public static void main(String args) 第8行 TempTest t = new TempTest();第9行 A a = new A();第10行 a.age = 10;第11行 t.test1(a);第12行方法中的age=”+a.age);第13行 第14行第15

8、行class A第16行 public int age = 0;第17行運(yùn)行結(jié)果為:test1方法中的age=20main方法中的age=10為什么這次的運(yùn)行結(jié)果和前面的例子不一樣呢,還是使用內(nèi)存示意圖來理解一下6:再次理解按引用傳遞(1):運(yùn)行開始,運(yùn)行第9行,創(chuàng)建了一個(gè)A的實(shí)例,內(nèi)存分配示意如下:(2):運(yùn)行第10行,是修改A實(shí)例里面的age的值,運(yùn)行后內(nèi)存分配示意如下:(3):運(yùn)行第11行,是把main方法中的變量a所引用的內(nèi)存空間地址,按引用傳遞給test1方法中的a變量。請(qǐng)注意:這兩個(gè)a變量是完全不同的,不要被名稱相同所蒙蔽。內(nèi)存分配示意如下:由于是按引用傳遞,也就是傳遞的是內(nèi)存空間

9、的地址,所以傳遞完成后形成的新的內(nèi)存示意圖如下:也就是說:是兩個(gè)變量都指向同一個(gè)空間。(4):運(yùn)行第3行,為test1方法中的變量a重新生成了新的A實(shí)例的,完成后形成的新的內(nèi)存示意圖如下:(5):運(yùn)行第4行,為test1方法中的變量a指向的新的A實(shí)例的age進(jìn)行賦值,完成后形成的新的內(nèi)存示意圖如下:注意:這個(gè)時(shí)候test1方法中的變量a的age被改變,而main方法中的是沒有改變的。(6):運(yùn)行第5行,根據(jù)此時(shí)的內(nèi)存示意圖,輸出test1方法中的age=20(7):運(yùn)行第12行,根據(jù)此時(shí)的內(nèi)存示意圖,輸出main方法中的age=107:說明(1):“在Java里面參數(shù)傳遞都是按值傳遞”這句話的意思是:按值傳遞是傳遞的值的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論