亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Java應用程序中的按值傳遞語義

2019-11-18 11:18:38
字體:
來源:轉載
供稿:網友

  幾個月前,developerWorks 發布了我的書 PRactical java 中的一些節選,該書是由 Addison-Wesley 出版的。首先我將利用 developerWorks 上的此欄目回答讀者提出的一些問題,然后對有關這些節選的各種評論作一答復。
  
  
  
  節選理解參數是按值而不是按引用傳遞的說明 Java 應用程序有且僅有的一種參數傳遞機制,即按值傳遞。寫它是為了揭穿普遍存在的一種神話,即認為 Java 應用程序按引用傳遞參數,以避免因依靠“按引用傳遞”這一行為而導致的常見編程錯誤。
  
  
  
  對此節選的某些反饋意見認為,我把這一問題搞糊涂了,或者將它完全搞錯了。許多不同意我的讀者用 C++ 語言作為例子。因此,在此欄目中我將使用 C++ 和 Java 應用程序進一步闡明一些事實。
  
  
  
  要點
  
  讀完所有的評論以后,問題終于明白了,至少在一個主要問題上產生了混淆。某些評論認為我的節選是錯的,因為對象是按引用傳遞的。對象確實是按引用傳遞的;節選與這沒有沖突。節選中說所有參數都是按值 -- 另一個參數 -- 傳遞的。下面的說法是正確的:在 Java 應用程序中永遠不會傳遞對象,而只傳遞對象引用。因此是按引用傳遞對象。但重要的是要區分參數是如何傳遞的,這才是該節選的意圖。Java 應用程序按引用傳遞對象這一事實并不意味著 Java 應用程序按引用傳遞參數。參數可以是對象引用,而 Java 應用程序是按值傳遞對象引用的。
  
  
  
  C++ 和 Java 應用程序中的參數傳遞
  
  Java 應用程序中的變量可以為以下兩種類型之一:引用類型或基本類型。當作為參數傳遞給一個方法時,處理這兩種類型的方式是相同的。兩種類型都是按值傳遞的;沒有一種按引用傳遞。這是一個重要特性,正如隨后的代碼示例所示的那樣。
  
  
  
  在繼續討論之前,定義按值傳遞和按引用傳遞這兩個術語是重要的。按值傳遞意味著當將一個參數傳遞給一個函數時,函數接收的是原始值的一個副本。因此,假如函數修改了該參數,僅改變副本,而原始值保持不變。按引用傳遞意味著當將一個參數傳遞給一個函數時,函數接收的是原始值的內存地址,而不是值的副本。因此,假如函數修改了該參數,調用代碼中的原始值也隨之改變。
  
  
  
  關于 Java 應用程序中參數傳遞的某些混淆源于這樣一個事實:許多程序員都是從 C++ 編程轉向 Java 編程的。C++ 既包含非引用類型,又包含引用類型,并分別按值和按引用傳遞它們。Java 編程語言有基本類型和對象引用;因此,認為 Java 應用程序像 C++ 那樣對基本類型使用按值傳遞,而對引用使用按引用傳遞是符合邏輯的。究竟您會這么想,假如正在傳遞一個引用,則它一定是按引用傳遞的。很輕易就會相信這一點,實際上有一段時間我也相信是這樣,但這不正確。
  
  
  
  在 C++ 和 Java 應用程序中,當傳遞給函數的參數不是引用時,傳遞的都是該值的一個副本(按值傳遞)。區別在于引用。在 C++ 中當傳遞給函數的參數是引用時,您傳遞的就是這個引用,或者內存地址(按引用傳遞)。在 Java 應用程序中,當對象引用是傳遞給方法的一個參數時,您傳遞的是該引用的一個副本(按值傳遞),而不是引用本身。請注重,調用方法的對象引用和副本都指向同一個對象。這是一個重要區別。Java 應用程序在傳遞不同類型的參數時,其作法與 C++ 并無不同。Java 應用程序按值傳遞所有參數,這樣就制作所有參數的副本,而不管它們的類型。
  
  
  
  示例
  
  我們將使用前面的定義和討論分析一些示例。首先考慮一段 C++ 代碼。C++ 語言同時使用按值傳遞和按引用傳遞的參數傳遞機制:
  
  
  
  清單 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
  
  
  
  
  
  
  
  這段代碼聲明了三個變量:兩個整型變量和一個指針變量。設置了每個變量的初始值并將其打印出來。同時打印出了指針值及其所指向的值。然后將所有三個變量作為參數傳遞給 modify 函數。前兩個參數是按值傳遞的,最后一個參數是按引用傳遞的。modify 函數的函數原型表明最后一個參數要作為引用傳遞?;叵胍幌?,C++ 按值傳遞所有參數,引用除外,后者是按引用傳遞的。
  
  
  
  modify 函數更改了所有三個參數的值:
  
  
  
  將第一個參數設置為 0。
  
  將第二個參數所指向的值設置為 7,然后將第二個參數設置為 0。
  
  將第三個參數設置為 0。
  
  
  
  將新值打印出來,然后函數返回。當執行返回到 main 時,再次打印出這三個參數的值以及指針所指向的值。作為第一個和第二個參數傳遞的變量不受 modify 函數的影響,因為它們是按值傳遞的。但指針所指向的值改變了。請注重,與前兩個參數不同,作為最后一個參數傳遞的變量被 modify 函數改變了,因為它是按引用傳遞的。
  
  
  
  現在考慮用 Java 語言編寫的類似代碼:
  
  
  
  清單 3:Java 應用程序 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");
  
  //按值傳遞所有參數
  
  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 應用程序的輸出 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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品人人做人人爽| 中文字幕精品www乱入免费视频| 在线视频一区二区| 亚洲天堂开心观看| 欧美性生活大片免费观看网址| 国产97在线|日韩| 欧美精品一区二区三区国产精品| 中文字幕av一区二区三区谷原希美| 91精品视频在线看| 久久不射电影网| 亚洲成人精品视频| 日韩成人激情影院| 狠狠综合久久av一区二区小说| 久久中文字幕一区| 青青草精品毛片| 国产色婷婷国产综合在线理论片a| 国产一区二区三区精品久久久| 4438全国亚洲精品在线观看视频| 最新69国产成人精品视频免费| 在线观看国产成人av片| 久久综合伊人77777尤物| 精品久久久久久中文字幕一区奶水| 亚洲精品国产拍免费91在线| 91干在线观看| 日本中文字幕久久看| 另类图片亚洲另类| 欧美成人全部免费| 亚洲成av人片在线观看香蕉| 亚洲精品一区二区三区婷婷月| 欧美性xxxxxxxxx| 色综合色综合久久综合频道88| 人人澡人人澡人人看欧美| 亚洲人成电影网站色…| 成人欧美一区二区三区在线湿哒哒| 久久久久久久久久国产| 国产日韩精品电影| 久久久在线观看| 久久久999精品视频| 成人性生交大片免费看视频直播| 亚洲精品720p| 亚洲人av在线影院| 国产91精品高潮白浆喷水| 国产精品久久久久久中文字| 欧美激情亚洲自拍| 最近2019年中文视频免费在线观看| 亚洲欧美精品一区| 久久精品2019中文字幕| 国产精品一区二区av影院萌芽| 性欧美暴力猛交69hd| 韩国v欧美v日本v亚洲| 精品国产一区二区在线| 国产精品白嫩美女在线观看| 色妞色视频一区二区三区四区| 欧美大码xxxx| 成人免费看吃奶视频网站| 国外色69视频在线观看| 国产成人在线精品| 91午夜理伦私人影院| 欧美区二区三区| 国产成人黄色av| 中文国产亚洲喷潮| 中文字幕最新精品| 国产精品三级美女白浆呻吟| 亚洲国产成人久久综合一区| 日韩欧美在线视频日韩欧美在线视频| 亚洲天堂精品在线| 久久久久久九九九| 国产成人精品免高潮费视频| 亚洲精品白浆高清久久久久久| 日韩视频在线观看免费| 亚洲国产精品成人av| 日韩一区二区久久久| 精品女同一区二区三区在线播放| 欧美中文字幕第一页| 日本一区二三区好的精华液| 日韩欧美在线免费观看| 国产精品久久久久久久久男| 亚洲女人天堂av| 国产日韩专区在线| 成人午夜在线观看| 国产精品www色诱视频| 国产性猛交xxxx免费看久久| 91精品国产高清自在线| 久久影院在线观看| 国产成人精品一区二区三区| 国内揄拍国内精品| 亚洲精品国产精品自产a区红杏吧| 国产97色在线|日韩| 成人性教育视频在线观看| 色播久久人人爽人人爽人人片视av| 91po在线观看91精品国产性色| 欲色天天网综合久久| 狠狠躁夜夜躁人人爽超碰91| 97视频在线观看免费| 日韩福利伦理影院免费| 97视频在线观看免费高清完整版在线观看| 亚洲精品视频免费在线观看| 久久久精品国产亚洲| 亚洲国产精品资源| 日韩国产中文字幕| 欧美日韩成人在线播放| 国产精品福利在线| 欧美国产日本在线| 亚洲国产97在线精品一区| 精品国产乱码久久久久久婷婷| 亚洲视频在线免费观看| 成人在线中文字幕| 精品国产一区二区三区久久狼黑人| 91色在线视频| 久久免费少妇高潮久久精品99| 精品欧美一区二区三区| 亚洲国产精品人人爽夜夜爽| 亚洲最大福利视频| 欧美精品日韩www.p站| 亚洲精品二三区| 日本精品久久久| 日本道色综合久久影院| 国产精品视频网| 欧美在线精品免播放器视频| 国产精品久久久久久久久久小说| 国产精品高清免费在线观看| 日韩av电影国产| 亚洲国产精品人久久电影| 奇门遁甲1982国语版免费观看高清| 日韩av在线免费观看| 精品亚洲一区二区三区在线观看| 国产免费亚洲高清| 久久精品视频99| 色午夜这里只有精品| 精品网站999www| 亚洲男人第一av网站| 亚洲美女免费精品视频在线观看| 亚洲国产精品人人爽夜夜爽| 8x海外华人永久免费日韩内陆视频| 欧美日韩爱爱视频| www.欧美三级电影.com| 国产精品狼人色视频一区| 深夜福利国产精品| 欧美性xxxx极品hd欧美风情| 91国内揄拍国内精品对白| 日韩美女主播视频| 精品女同一区二区三区在线播放| 久久久久久中文字幕| 日韩中文字幕国产| 欧美精品电影免费在线观看| 国产成人综合亚洲| 欧美日韩高清在线观看| 97精品一区二区三区| 成人黄色在线观看| 日韩在线欧美在线国产在线| 亚洲欧美另类中文字幕| 97精品一区二区视频在线观看| 在线成人激情黄色| 精品久久久精品| 久久全国免费视频| 欧美日本黄视频| 中文字幕av一区| 国产精品视频在线观看| 亚洲激情小视频| 国产精品成熟老女人| 日韩在线观看免费av| 欧美精品日韩三级| 亚洲成人av在线播放| 欧美性猛交xxxxx免费看|