国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開(kāi)發(fā)教程 > 詳細(xì)頁(yè)面

Java 應(yīng)用程序中的按值傳遞語(yǔ)義(轉(zhuǎn))

Java 應(yīng)用程序中的按值傳遞語(yǔ)義(轉(zhuǎn))

更新時(shí)間:2022-04-26 文章作者:未知 信息來(lái)源:網(wǎng)絡(luò) 閱讀次數(shù):

Java 應(yīng)用程序中的按值傳遞語(yǔ)義
原文http://www.cn.ibm.com/developerWorks/java/passbyval/index.shtml

節(jié)選理解參數(shù)是按值而不是按引用傳遞的說(shuō)明 Java 應(yīng)用程序有且僅有的一種參數(shù)傳遞機(jī)制,即按值傳遞。寫(xiě)它是為了揭穿普遍存在的一種神話(huà),即認(rèn)為 Java 應(yīng)用程序按引用傳遞參數(shù),以避免因依賴(lài)“按引用傳遞”這一行為而導(dǎo)致的常見(jiàn)編程錯(cuò)誤。

對(duì)此節(jié)選的某些反饋意見(jiàn)認(rèn)為,我把這一問(wèn)題搞糊涂了,或者將它完全搞錯(cuò)了。許多不同意我的讀者用 C++ 語(yǔ)言作為例子。因此,在此欄目中我將使用 C++ 和 Java 應(yīng)用程序進(jìn)一步闡明一些事實(shí)。

要點(diǎn)
讀完所有的評(píng)論以后,問(wèn)題終于明白了,至少在一個(gè)主要問(wèn)題上產(chǎn)生了混淆。某些評(píng)論認(rèn)為我的節(jié)選是錯(cuò)的,因?yàn)閷?duì)象是按引用傳遞的。對(duì)象確實(shí)是按引用傳遞的;節(jié)選與這沒(méi)有沖突。節(jié)選中說(shuō)所有參數(shù)都是按值 -- 另一個(gè)參數(shù) -- 傳遞的。下面的說(shuō)法是正確的:在 Java 應(yīng)用程序中永遠(yuǎn)不會(huì)傳遞對(duì)象,而只傳遞對(duì)象引用。因此是按引用傳遞對(duì)象。但重要的是要區(qū)分參數(shù)是如何傳遞的,這才是該節(jié)選的意圖。Java 應(yīng)用程序按引用傳遞對(duì)象這一事實(shí)并不意味著 Java 應(yīng)用程序按引用傳遞參數(shù)。參數(shù)可以是對(duì)象引用,而 Java 應(yīng)用程序是按值傳遞對(duì)象引用的。

C++ 和 Java 應(yīng)用程序中的參數(shù)傳遞
Java 應(yīng)用程序中的變量可以為以下兩種類(lèi)型之一:引用類(lèi)型或基本類(lèi)型。當(dāng)作為參數(shù)傳遞給一個(gè)方法時(shí),處理這兩種類(lèi)型的方式是相同的。兩種類(lèi)型都是按值傳遞的;沒(méi)有一種按引用傳遞。這是一個(gè)重要特性,正如隨后的代碼示例所示的那樣。

在繼續(xù)討論之前,定義按值傳遞和按引用傳遞這兩個(gè)術(shù)語(yǔ)是重要的。按值傳遞意味著當(dāng)將一個(gè)參數(shù)傳遞給一個(gè)函數(shù)時(shí),函數(shù)接收的是原始值的一個(gè)副本。因此,如果函數(shù)修改了該參數(shù),僅改變副本,而原始值保持不變。按引用傳遞意味著當(dāng)將一個(gè)參數(shù)傳遞給一個(gè)函數(shù)時(shí),函數(shù)接收的是原始值的內(nèi)存地址,而不是值的副本。因此,如果函數(shù)修改了該參數(shù),調(diào)用代碼中的原始值也隨之改變。

關(guān)于 Java 應(yīng)用程序中參數(shù)傳遞的某些混淆源于這樣一個(gè)事實(shí):許多程序員都是從 C++ 編程轉(zhuǎn)向 Java 編程的。C++ 既包含非引用類(lèi)型,又包含引用類(lèi)型,并分別按值和按引用傳遞它們。Java 編程語(yǔ)言有基本類(lèi)型和對(duì)象引用;因此,認(rèn)為 Java 應(yīng)用程序像 C++ 那樣對(duì)基本類(lèi)型使用按值傳遞,而對(duì)引用使用按引用傳遞是符合邏輯的。畢竟您會(huì)這么想,如果正在傳遞一個(gè)引用,則它一定是按引用傳遞的。很容易就會(huì)相信這一點(diǎn),實(shí)際上有一段時(shí)間我也相信是這樣,但這不正確。

在 C++ 和 Java 應(yīng)用程序中,當(dāng)傳遞給函數(shù)的參數(shù)不是引用時(shí),傳遞的都是該值的一個(gè)副本(按值傳遞)。區(qū)別在于引用。在 C++ 中當(dāng)傳遞給函數(shù)的參數(shù)是引用時(shí),您傳遞的就是這個(gè)引用,或者內(nèi)存地址(按引用傳遞)。在 Java 應(yīng)用程序中,當(dāng)對(duì)象引用是傳遞給方法的一個(gè)參數(shù)時(shí),您傳遞的是該引用的一個(gè)副本(按值傳遞),而不是引用本身。請(qǐng)注意,調(diào)用方法的對(duì)象引用和副本都指向同一個(gè)對(duì)象。這是一個(gè)重要區(qū)別。Java 應(yīng)用程序在傳遞不同類(lèi)型的參數(shù)時(shí),其作法與 C++ 并無(wú)不同。Java 應(yīng)用程序按值傳遞所有參數(shù),這樣就制作所有參數(shù)的副本,而不管它們的類(lèi)型。

示例
我們將使用前面的定義和討論分析一些示例。首先考慮一段 C++ 代碼。C++ 語(yǔ)言同時(shí)使用按值傳遞和按引用傳遞的參數(shù)傳遞機(jī)制:

清單 1:C++ 示例 #include
#include

void modify(int a, int *P, int &r);

int main (int argc, char** argv)
{
int val, ref;
int *pint;

val = 10;
ref = 50;
pint = (int*)malloc(sizeof(int));
*pint = 15;

printf("val is %d\n", val);
printf("pint is %d\n", pint);
printf("*pint is %d\n", *pint);
printf("ref is %d\n\n", ref);

printf("calling modify\n");
//按值傳遞 val 和 pint,按引用傳遞 ref。
modify(val, pint, ref);
printf("returned from modify\n\n");

printf("val is %d\n", val);
printf("pint is %d\n", pint);
printf("*pint is %d\n", *pint);
printf("ref is %d\n", ref);

return 0;
}

void modify(int a, int *p, int &r)
{
printf("in modify...\n");
a = 0;
*p = 7;
p = 0;
r = 0;
printf("a is %d\n", a);
printf("p is %d\n", p);
printf("r is %d\n", r);
}




這段代碼的輸出為:

清單 2:C++ 代碼的輸出 val is 10
pint is 4262128
*pint is 15
ref is 50

calling modify
in modify...
a is 0
p is 0
r is 0
returned from modify

val is 10
pint is 4262128
*pint is 7
ref is 0



這段代碼聲明了三個(gè)變量:兩個(gè)整型變量和一個(gè)指針變量。設(shè)置了每個(gè)變量的初始值并將其打印出來(lái)。同時(shí)打印出了指針值及其所指向的值。然后將所有三個(gè)變量作為參數(shù)傳遞給 modify 函數(shù)。前兩個(gè)參數(shù)是按值傳遞的,最后一個(gè)參數(shù)是按引用傳遞的。modify 函數(shù)的函數(shù)原型表明最后一個(gè)參數(shù)要作為引用傳遞。回想一下,C++ 按值傳遞所有參數(shù),引用除外,后者是按引用傳遞的。

modify 函數(shù)更改了所有三個(gè)參數(shù)的值:

將第一個(gè)參數(shù)設(shè)置為 0。
將第二個(gè)參數(shù)所指向的值設(shè)置為 7,然后將第二個(gè)參數(shù)設(shè)置為 0。
將第三個(gè)參數(shù)設(shè)置為 0。

將新值打印出來(lái),然后函數(shù)返回。當(dāng)執(zhí)行返回到 main 時(shí),再次打印出這三個(gè)參數(shù)的值以及指針?biāo)赶虻闹怠W鳛榈谝粋(gè)和第二個(gè)參數(shù)傳遞的變量不受 modify 函數(shù)的影響,因?yàn)樗鼈兪前粗祩鬟f的。但指針?biāo)赶虻闹蹈淖兞恕U?qǐng)注意,與前兩個(gè)參數(shù)不同,作為最后一個(gè)參數(shù)傳遞的變量被 modify 函數(shù)改變了,因?yàn)樗前匆脗鬟f的。

現(xiàn)在考慮用 Java 語(yǔ)言編寫(xiě)的類(lèi)似代碼:

清單 3:Java 應(yīng)用程序 class Test
{
public static void main(String args[])
{
int val;
StringBuffer sb1, sb2;

val = 10;
sb1 = new StringBuffer("apples");
sb2 = new StringBuffer("pears");
System.out.println("val is " + val);
System.out.println("sb1 is " + sb1);
System.out.println("sb2 is " + sb2);
System.out.println("");

System.out.println("calling modify");
//按值傳遞所有參數(shù)
modify(val, sb1, sb2);
System.out.println("returned from modify");
System.out.println("");

System.out.println("val is " + val);
System.out.println("sb1 is " + sb1);
System.out.println("sb2 is " + sb2);
}

public static void modify(int a, StringBuffer r1,
StringBuffer r2)
{
System.out.println("in modify...");
a = 0;
r1 = null;//1
r2.append(" taste good");
System.out.println("a is " + a);
System.out.println("r1 is " + r1);
System.out.println("r2 is " + r2);
}
}



這段代碼的輸出為:

清單 4:Java 應(yīng)用程序的輸出 val is 10
sb1 is apples
sb2 is pears

calling modify
in modify...
a is 0
r1 is null
r2 is pears taste good
returned from modify

val is 10
sb1 is apples
sb2 is pears taste good



這段代碼聲明了三個(gè)變量:一個(gè)整型變量和兩個(gè)對(duì)象引用。設(shè)置了每個(gè)變量的初始值并將它們打印出來(lái)。然后將所有三個(gè)變量作為參數(shù)傳遞給 modify 方法。

modify 方法更改了所有三個(gè)參數(shù)的值:

將第一個(gè)參數(shù)(整數(shù))設(shè)置為 0。
將第一個(gè)對(duì)象引用 r1 設(shè)置為 null。
保留第二個(gè)引用 r2 的值,但通過(guò)調(diào)用 append 方法更改它所引用的對(duì)象(這與前面的 C++ 示例中對(duì)指針 p 的處理類(lèi)似)。

當(dāng)執(zhí)行返回到 main 時(shí),再次打印出這三個(gè)參數(shù)的值。正如預(yù)期的那樣,整型的 val 沒(méi)有改變。對(duì)象引用 sb1 也沒(méi)有改變。如果 sb1 是按引用傳遞的,正如許多人聲稱(chēng)的那樣,它將為 null。但是,因?yàn)?Java 編程語(yǔ)言按值傳遞所有參數(shù),所以是將 sb1 的引用的一個(gè)副本傳遞給了 modify 方法。當(dāng) modify 方法在 //1 位置將 r1 設(shè)置為 null 時(shí),它只是對(duì) sb1 的引用的一個(gè)副本進(jìn)行了該操作,而不是像 C++ 中那樣對(duì)原始值進(jìn)行操作。

另外請(qǐng)注意,第二個(gè)對(duì)象引用 sb2 打印出的是在 modify 方法中設(shè)置的新字符串。即使 modify 中的變量 r2 只是引用 sb2 的一個(gè)副本,但它們指向同一個(gè)對(duì)象。因此,對(duì)復(fù)制的引用所調(diào)用的方法更改的是同一個(gè)對(duì)象。

編寫(xiě)一個(gè)交換方法
假定我們知道參數(shù)是如何傳遞的,在 C++ 中編寫(xiě)一個(gè)交換函數(shù)可以用不同的方式完成。使用指針的交換函數(shù)類(lèi)似以下代碼,其中指針是按值傳遞的:

清單 5:使用指針的交換函數(shù) #include
#include

void swap(int *a, int *b);

int main (int argc, char** argv)
{
int val1, val2;
val1 = 10;
val2 = 50;
swap(&val1, &val2);
return 0;
}

void swap(int *a, int *b)
{
int temp = *b;
*b = *a;
*a = temp;
}




使用引用的交換函數(shù)類(lèi)似以下代碼,其中引用是按引用傳遞的:

清單 6:使用引用的交換函數(shù) #include
#include

void swap(int &a, int &b);

int main (int argc, char** argv)
{
int val1, val2;
val1 = 10;
val2 = 50;
swap(val1, val2);
return 0;
}

void swap(int &a, int &b)
{
int temp = b;
b = a;
a = temp;
}



兩個(gè) C++ 代碼示例都像所希望的那樣交換了值。如果 Java 應(yīng)用程序使用“按引用傳遞”,則下面的交換方法應(yīng)像 C++ 示例一樣正常工作:

清單 7:Java 交換函數(shù)是否像 C++ 中那樣按引用傳遞參數(shù) class Swap
{
public static void main(String args[])
{
Integer a, b;

a = new Integer(10);
b = new Integer(50);

System.out.println("before swap...");
System.out.println("a is " + a);
System.out.println("b is " + b);
swap(a, b);
System.out.println("after swap...");
System.out.println("a is " + a);
System.out.println("b is " + b);
}

public static void swap(Integer a, Integer b)
{
Integer temp = a;
a = b;
b = temp;
}
}



因?yàn)?Java 應(yīng)用程序按值傳遞所有參數(shù),所以這段代碼不會(huì)正常工作,其生成的輸入如下所示:

清單 8:清單 7 的輸出 before swap...
a is 10
b is 50
after swap...
a is 10
b is 50



那么,在 Java 應(yīng)用程序中如何編寫(xiě)一個(gè)方法來(lái)交換兩個(gè)基本類(lèi)型的值或兩個(gè)對(duì)象引用的值呢?因?yàn)?Java 應(yīng)用程序按值傳遞所有的參數(shù),所以您不能這樣做。要交換值,您必須用在方法調(diào)用外部用內(nèi)聯(lián)來(lái)完成。

結(jié)論
我在書(shū)中包括該信息的意圖并不是作瑣細(xì)的分析或試圖使問(wèn)題復(fù)雜化,而是想警告程序員:在 Java 應(yīng)用程序中假定“按引用傳遞”語(yǔ)義是危險(xiǎn)的。如果您在 Java 應(yīng)用程序中假定“按引用傳遞”語(yǔ)義,您就可能寫(xiě)出類(lèi)似上面的交換方法,然后疑惑它為什么不正常工作。

我必須承認(rèn),在我第一次認(rèn)識(shí)到 Java 應(yīng)用程序按值傳遞所有參數(shù)時(shí),我也曾表示懷疑。我曾一直假定因?yàn)?Java 應(yīng)用程序有兩種類(lèi)型,所以他們按值傳遞基本類(lèi)型而按引用傳遞引用,就像 C++ 那樣。在轉(zhuǎn)向 Java 編程之前我已用 C++ 編程好幾年了,感覺(jué)任何其他事情似乎都不直觀(guān)。但是,一旦我理解了發(fā)生的事情,我就相信 Java 語(yǔ)言按值傳遞所有參數(shù)的方法更加直觀(guān)。The Java Programming Language,Second Edition 的作者,Ken Arnold 和 James Gosling 在 2.6.1 節(jié)中說(shuō)得最好:“在 Java 中只有一種參數(shù)傳遞模式 -- 按值傳遞 -- 這有助于使事情保持簡(jiǎn)單。”

溫馨提示:喜歡本站的話(huà),請(qǐng)收藏一下本站!

本類(lèi)教程下載

系統(tǒng)下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        日韩情涩欧美日韩视频| 成人av片在线观看| 国产福利91精品一区| 欧美v国产在线一区二区三区| 秋霞国产午夜精品免费视频| 欧美精品精品一区| 麻豆精品新av中文字幕| 久久综合久久久久88| 波多野结衣中文字幕一区二区三区 | 日韩美女视频一区| 在线欧美日韩精品| 欧美aⅴ一区二区三区视频| 久久综合色8888| 色综合色狠狠天天综合色| 午夜精品成人在线| 国产人成一区二区三区影院| 欧日韩精品视频| 国产一区二区福利视频| 伊人色综合久久天天人手人婷| 欧美精品1区2区3区| 春色校园综合激情亚洲| 日日夜夜免费精品| 亚洲欧美偷拍三级| 精品欧美乱码久久久久久1区2区| www.欧美日韩国产在线| 久久av资源站| 亚洲成a人在线观看| 中文一区二区在线观看| 4438亚洲最大| 91成人在线精品| 成人性生交大合| 久久er99精品| 免费人成精品欧美精品| 亚洲精品免费一二三区| 国产欧美日韩视频在线观看| 欧美一级片在线观看| 欧美视频在线不卡| 不卡影院免费观看| 国产91精品一区二区麻豆网站| 五月天婷婷综合| 亚洲视频香蕉人妖| 国产欧美一区二区三区鸳鸯浴| 欧美一区午夜视频在线观看| 欧美日韩亚洲高清一区二区| 91老师国产黑色丝袜在线| 国产91精品一区二区麻豆网站| 韩国精品免费视频| 蜜桃精品在线观看| 青椒成人免费视频| 蜜臀av性久久久久蜜臀av麻豆| 伊人一区二区三区| 亚洲精品亚洲人成人网| 亚洲人成影院在线观看| 日本一区二区三区视频视频| 久久品道一品道久久精品| 欧美va在线播放| 日韩网站在线看片你懂的| 欧美一级电影网站| 日韩视频免费观看高清在线视频| 3atv一区二区三区| 日韩你懂的在线播放| 精品少妇一区二区三区免费观看| 欧美一区二区三区四区五区| 日韩欧美国产wwwww| 精品精品欲导航| 亚洲精品一区二区在线观看| 久久精品男人的天堂| 亚洲国产成人私人影院tom | 欧美日本一区二区| 日韩一区二区在线看片| 久久久久久97三级| 国产精品久久久久7777按摩 | 丁香激情综合五月| 色综合久久99| 67194成人在线观看| 精品精品欲导航| 亚洲国产高清在线| 亚洲午夜在线电影| 蜜臀91精品一区二区三区| 国产精品一区二区久久精品爱涩| 成人免费毛片高清视频| 色综合天天综合色综合av| 欧美精选午夜久久久乱码6080| 欧美电影免费观看完整版| 中文字幕国产一区二区| 亚洲成人在线免费| 国产成人免费在线| 欧美午夜不卡在线观看免费| 欧美r级电影在线观看| 国产精品久久久久天堂| 图片区小说区区亚洲影院| 粉嫩一区二区三区性色av| 欧美在线观看禁18| 久久精品水蜜桃av综合天堂| 亚洲成人777| 成人黄色一级视频| 日韩欧美一级在线播放| 亚洲欧美一区二区三区孕妇| 天堂资源在线中文精品| 处破女av一区二区| 日韩一级黄色片| 亚洲在线视频网站| 成人99免费视频| 精品99一区二区| 日日夜夜免费精品| 在线免费不卡视频| 国产精品美女一区二区在线观看| 免费久久精品视频| 欧美色视频一区| 亚洲免费在线视频一区 二区| 国产专区欧美精品| 欧美一级日韩免费不卡| 亚洲一区在线观看网站| www.日韩大片| 国产精品五月天| 国产一区二区毛片| 精品欧美乱码久久久久久| 日韩不卡在线观看日韩不卡视频| 色狠狠av一区二区三区| 中文字幕一区二区三区乱码在线 | 欧美日韩一区二区在线视频| 国产精品毛片久久久久久| 国产精品一卡二卡| 欧美大肚乱孕交hd孕妇| 青娱乐精品视频在线| 欧美日韩视频在线第一区| 亚洲免费观看高清完整版在线观看 | 丁香一区二区三区| 久久综合99re88久久爱| 精品写真视频在线观看| 日韩欧美国产一区二区三区| 美女一区二区视频| 欧美xxxxxxxx| 国产精品一级二级三级| 国产丝袜欧美中文另类| 久久99精品国产麻豆婷婷洗澡| 日韩毛片视频在线看| 欧美写真视频网站| 欧美探花视频资源| 18欧美亚洲精品| jiyouzz国产精品久久| 欧美激情一区在线| 成人av免费网站| 综合久久一区二区三区| 91麻豆swag| 亚洲综合一二区| 欧美美女视频在线观看| 久久成人久久鬼色| 国产精品久线观看视频| 91麻豆免费观看| 视频一区在线播放| xnxx国产精品| 99久久精品国产精品久久| 亚洲欧美福利一区二区| 欧美高清激情brazzers| 国内精品在线播放| 亚洲日本在线视频观看| 欧美日本一区二区三区四区| 久久99国产精品久久99| 中文字幕二三区不卡| 欧美日韩成人综合在线一区二区| 韩国午夜理伦三级不卡影院| 亚洲视频在线观看三级| 日韩一区二区三区精品视频| 成人综合激情网| 亚洲gay无套男同| 国产日韩欧美综合在线| 在线一区二区视频| 国产一区日韩二区欧美三区| 亚洲欧美另类小说| 日韩精品一区二区三区四区视频| 不卡欧美aaaaa| 蜜臀av一区二区| 亚洲伊人色欲综合网| 国产日韩av一区二区| 6080国产精品一区二区| a亚洲天堂av| 国产麻豆精品在线观看| 五月激情综合色| 日韩毛片高清在线播放| 精品国产凹凸成av人网站| 欧美性受xxxx黑人xyx性爽| 成人在线一区二区三区| 麻豆精品国产传媒mv男同| 亚洲精品国产无天堂网2021| 国产偷国产偷精品高清尤物 | 蜜乳av一区二区三区| 亚洲视频免费看| 精品国产一区二区三区不卡| 欧美午夜精品一区二区三区| 菠萝蜜视频在线观看一区| 激情都市一区二区| 天天色天天操综合| 亚洲制服丝袜在线| 亚洲摸摸操操av| 亚洲美女在线一区| 亚洲私人黄色宅男| 亚洲视频综合在线| 综合欧美一区二区三区| 一区在线观看免费|