Java經典問題:傳值與傳引用?

來源:互聯網
上載者:User

標籤:

轉自:http://developer.51cto.com/art/201104/254715.htm

Java到底是傳值還是傳引用?相信很少有人能完全回答正確。通常的說法是:對於基礎資料型別 (Elementary Data Type)(整型、浮點型、字元型、布爾型等),傳值;對於參考型別(對象、數組),傳引用。基本類型傳值,所有人都不會對此有疑義;問題出在參考型別上。

為引入正題,不妨先看看下面的例子,你能正確給出程式的運行結果嘛?

 

  1. /**   
  2.  * @(#)Swap.java  
  3.  *  
  4.  *  
  5.  *  @author    
  6.  *  @version  1.00 2007/1/5  
  7.   */   
  8.    
  9.    
  10.   public   class  Swap   {  
  11.  
  12.      public  Swap()   {}   
  13.       
  14.      public   static   void  main(String[] args)   {  
  15.         Changer c  =   new  Changer();  
  16.           
  17.         String stra  =   " Mighty " ;  
  18.         String strb  =   " Mouse " ;  
  19.            c.swap(stra, strb);  
  20.         System.out.println(stra  +   "   "   +  strb);  
  21.           
  22.         String[] strArr  =   new  String[ 2 ] ;  
  23.         strArr[ 0 ]  =  stra;  
  24.         strArr[ 1 ]  =  strb;  
  25.         c.swap(strArr);  
  26.         System.out.println(strArr[ 0 ]  +    "   "   +  strArr[ 1 ]);           
  27.     }   
  28.       
  29.      static   class  Changer   {        
  30.          public   < T >   void  swap(T a, T b)   {  
  31.             T temp  =  a;  
  32.             a  =  b;  
  33.             b  =  temp;  
  34.         }   
  35.           
  36.          public   < T >   void  swap(T[] t)   {  
  37.              if  (t.length  <   2 )   {  
  38.                 System.out.println( " error! " );  
  39.                  return ;  
  40.             }   
  41.               
  42.             T temp  =  t[ 0 ];  
  43.             t[ 0 ]  =  t[ 1 ];  
  44.             t[ 1 ]  =  temp;  
  45.         }   
  46.     }   
  47. }   

 

上面程式的正確運行結果為:

Mighty Mouse

Mouse Mighty

你答對了嘛?

下面我們來分析一下:為什麼會出現上面的運行結果?

為分析這個問題,我們必須對程式中的資料在記憶體中的布局有一定瞭解。上面main程式中和String相關的變數共有3個,其布局可以用所示:

 

 

當調用swap(stra, strb)函數時,傳遞的是參考型別stra、strb的拷貝值,因此函數中任何對參數的改變都不會影響到stra和strb的值;而調用swap(strArr)時,傳遞的是strArr的拷貝值,程式中對參數的任何改變仍然不會影響到strArr的值,然而swap(T[] t)中改變的並不是strArr的值,而是strArr[0]和strArr[1]的值,也就是參考型別strArr所指向的對象的值,因而strArr[0]和strArr[1]的值發生了變化。

從上面的分析,我們可以得出結論:對於參考型別,其實參數傳遞時仍然是按值傳遞的;當然,按引用傳遞也不是完全沒有道理,只是參考對象不是參考型別本身,而是參考型別所指向的對象。

Java經典問題:傳值與傳引用?

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.