关闭

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

发表于:2011-4-12 09:29

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:king_wangyao    来源:51Testing软件测试网采编

#
java

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

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

  • /**  
  •  * @(#)Swap.java 
  •  * 
  •  * 
  •  *  @author   
  •  *  @version  1.00 2007/1/5 
  •   */   
  •    
  •    
  •   public   class  Swap   {  
  •      public  Swap()   {}   
  •       
  •      public   static   void  main(String[] args)   {  
  •         Changer c  =   new  Changer();  
  •           
  •         String stra  =   " Mighty " ;  
  •         String strb  =   " Mouse " ;  
  •            c.swap(stra, strb);  
  •         System.out.println(stra  +   "   "   +  strb);  
  •           
  •         String[] strArr  =   new  String[ 2 ] ;  
  •         strArr[ 0 ]  =  stra;  
  •         strArr[ 1 ]  =  strb;  
  •         c.swap(strArr);  
  •         System.out.println(strArr[ 0 ]  +    "   "   +  strArr[ 1 ]);           
  •     }   
  •       
  •      static   class  Changer   {        
  •          public   < T >   void  swap(T a, T b)   {  
  •             T temp  =  a;  
  •             a  =  b;  
  •             b  =  temp;  
  •         }   
  •           
  •          public   < T >   void  swap(T[] t)   {  
  •              if  (t.length  <   2 )   {  
  •                 System.out.println( " error! " );  
  •                  return ;  
  •             }   
  •               
  •             T temp  =  t[ 0 ];  
  •             t[ 0 ]  =  t[ 1 ];  
  •             t[ 1 ]  =  temp;  
  •         }   
  •     }   
  • }
  •   上面程序的正确运行结果为:

      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]的值发生了变化。

      从上面的分析,我们可以得出结论:对于引用类型,其实参数传递时仍然是按值传递的;当然,按引用传递也不是完全没有道理,只是参考对象不是引用类型本身,而是引用类型所指向的对象。

    《2023软件测试行业现状调查报告》独家发布~

    精彩评论

    • cq2735013
      2011-4-15 17:12:49

      其实没有转引用之说,引用地址~~~! 这个是JAVA面试时 我必须问的.还有一个就是equal()与==

    关注51Testing

    联系我们

    快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

    法律顾问:上海兰迪律师事务所 项棋律师
    版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
    投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

    沪ICP备05003035号

    沪公网安备 31010102002173号