Java经典问题:传值与传引用?

Java到底是传值还是传引用?相信很少有人能完全回答正确。通常的说法是:对于基本数据类型(整型、浮点型、字符型、布尔型等),传值;对于引用类型(对象、数组),传引用。基本类型传值,所有人都不会对此有疑义;问题出在引用类型上。

为引入正题,不妨先看看下面的例子,你能正确给出程序的运行结果嘛?

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

上面程序的正确运行结果为:

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经典问题:传值与传引用?
当前网址:http://www.shufengxianlan.com/qtweb/news41/467691.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联