日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java引用传递106_(转载)java的值传递与引用传递

發(fā)布時(shí)間:2023/12/15 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java引用传递106_(转载)java的值传递与引用传递 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1 說(shuō)明:本文的適用對(duì)象為java初學(xué)者、如果有讀者發(fā)現(xiàn)文章中有敘述不妥之處,請(qǐng)指正。2

3 今天在論壇上有人提了一個(gè)關(guān)于java中調(diào)用函數(shù)時(shí)有沒(méi)有引用傳遞的問(wèn)題,可謂是吵的不可開(kāi)交。有人說(shuō)java只有值傳遞,也有人說(shuō)java既有值傳遞也有引用傳遞,那么java中到底有沒(méi)有引用傳遞呢,下面我來(lái)分析一下。4

5 一、首先來(lái)明確一下"值傳遞"和"引用傳遞的"區(qū)別6

7 值傳遞:是對(duì)所傳遞參數(shù)進(jìn)行一次副本拷貝,對(duì)參數(shù)的修改只是對(duì)副本的修改,函數(shù)調(diào)用結(jié)束,副本丟棄,原來(lái)的變量不變(即實(shí)參不變)8 引用傳遞:參數(shù)被傳遞到函數(shù)時(shí),不復(fù)制副本,而是直接將參數(shù)自身傳入到函數(shù),函數(shù)內(nèi)對(duì)參數(shù)的任何改變都將反映到原來(lái)的變量上。9 二、java中引用的含義10

11 C++和java中都有引用的概念,但在這兩種語(yǔ)言中卻有完全不同的含義。C++中我們可以用形如"int &b=a”的形式來(lái)定義變量a的一個(gè)引用b,b只是a的一個(gè)別名,b和a在內(nèi)存中占同一個(gè)存儲(chǔ)單元,利用引用機(jī)制我們可以在調(diào)用函數(shù)時(shí)實(shí)現(xiàn)值的雙向傳遞——即引用傳遞,看下面代碼:

12

13 示例一14

15 #include

16

17 using namespace std;18

19 intmain()20

21 {22

23 void swap(int &,int &);24

25 int i=3,j=5;26

27 swap(i,j);28

29 cout<

31 return 0;32

33 }34

35

36

37 void swap(int &a,int &b)38

39 {40

41 inttemp;42

43 temp=a;44

45 a=b;46

47 b=temp;48

49 }50

51 執(zhí)行上面的程序輸出的是i=5 j=3,a和b傳遞給swap()函數(shù)的時(shí)候,是傳遞的他們本身的地址,不是他們的拷貝,所以在函數(shù)中對(duì)他們的改變可以直接影響到實(shí)參a和b,這就是引用傳遞。52

53 java中的引用更像C++中的指針,當(dāng)我們定義一個(gè)對(duì)象時(shí)(比如Person p=newPerson()),定義的對(duì)象實(shí)例會(huì)放到j(luò)ava堆中,而變量p(即引用)會(huì)放到j(luò)ava棧中,p指向堆中的Person對(duì)象實(shí)例。54

55 三、對(duì)引用傳遞的認(rèn)識(shí)誤區(qū)56

57 為什么有很多人認(rèn)為java有引用傳遞呢?一種情況是有人認(rèn)為調(diào)用函數(shù)時(shí)其參數(shù)有可能是引用(如上面的p),所以java有引用傳遞,這部分人對(duì)引用傳遞根本沒(méi)有正確的認(rèn)識(shí);而另一種情況看似有道理,但是仔細(xì)分析也是不正確的的,他們往往會(huì)用如下的代碼來(lái)證明他們的觀點(diǎn):58

59 實(shí)例二:60

61 復(fù)制代碼62 classDemo{63 inta;64 public Demo(inta){65 this.a=a;66 }67 }68 public classTestQuote{69 public static voidmain(String args[]){70 Demo d1=new Demo(1);71 Demo d2=new Demo(2);72 System.out.println(d1.a);73 System.out.println(d2.a);74 function(d1,d2);75 System.out.println(d1.a);76 System.out.println(d2.a);77 }78 private static voidfunction(Demo d1,Demo d2){79 inta;80 a=d1.a;81 d1.a=d2.a;82 d2.a=a;83 }84 }85 復(fù)制代碼86 他們的觀點(diǎn)如下:執(zhí)行上面的代碼,調(diào)用function()函數(shù)以前輸出的結(jié)果是1、2,調(diào)用function()函數(shù)之后輸出的結(jié)果會(huì)是2、1,可見(jiàn)在函數(shù)內(nèi)對(duì)d1和d2的改變反映到了原來(lái)的變量上,要不是不會(huì)輸出2、1的。87

88 這種解釋是很迷惑人的,看上去好像很正確,下面的代碼會(huì)很好的反駁上面的觀點(diǎn):89

90 示例三:91

92 復(fù)制代碼93 classDemo{94 inta;95 public Demo(inta){96 this.a=a;97 }98 }99 public classTestQuote{100 public static voidmain(String args[]){101 Demo d1=new Demo(1);102 Demo d2=new Demo(2);103 System.out.println(d1.a);104 System.out.println(d2.a);105 function(d1,d2);106 System.out.println(d1.a);107 System.out.println(d2.a);108 }109 private static voidfunction(Demo d1,Demo d2){110 Demo temp;111 temp=d1;112 d1=d2;113 d2=temp;114 }115 }116 復(fù)制代碼117 執(zhí)行上面的代碼,調(diào)用function()前后程序輸出的都是1、2,此程序試圖通過(guò)調(diào)用function()交換d1和d2,但是沒(méi)有成功,為什么呢?因?yàn)閐1和d2是值傳遞,function()中的d1和d2是main()函數(shù)中d1和d2的副本,調(diào)用完function()不會(huì)對(duì)main()中的變量產(chǎn)生影響。再看示例二中,function()函數(shù)內(nèi)改變的并不是d1和d2本身的值,而是d1和d2指向的對(duì)象的值,調(diào)用完function()后d1和d2仍然指向函數(shù)調(diào)用前的堆地址,即函數(shù)參數(shù)是棧中的d1和d2,而不是堆中d1和d2指向的對(duì)象,即使你在函數(shù)中改變了堆中的對(duì)象,但沒(méi)有改變函數(shù)參數(shù)的值。所以示例二并不是什么引用傳遞;可見(jiàn)java中只有值傳遞。118

119

120

121 但是網(wǎng)上有很多針對(duì)"java值傳遞和引用傳遞進(jìn)行的區(qū)別"的文章,如果讀者看到的話一定要清楚,其中所說(shuō)的引用傳遞是不正確的,他們所說(shuō)的引用傳遞就是示例二中的那種情況。不幸的是,網(wǎng)上有很多文章都把示例二中的那樣的傳遞看做引用傳遞,如果讀者看到知道是什么意思就行了。

總結(jié)

以上是生活随笔為你收集整理的java引用传递106_(转载)java的值传递与引用传递的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。