zoukankan      html  css  js  c++  java
  • Java经典问题:传值与传引用?

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

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

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

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

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

  • 相关阅读:
    Elasticsearch重要文章之四:监控每个节点(ThreadPool部分)
    [翻译]Elasticsearch重要文章之四:监控每个节点(jvm部分)
    IDFA
    Python中eval函数的作用
    Android开发重点难点:RelativeLayout(相对布局)详解
    布局相关
    Nginx配置proxy_pass
    Docker部署Elasticsearch集群
    extends Thread 与 implements Runnable 的区别
    玩转 Redis缓存 集群高可用
  • 原文地址:https://www.cnblogs.com/wangpei/p/4638100.html
Copyright © 2011-2022 走看看