lotusswan

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  11 Posts :: 0 Stories :: 4 Comments :: 0 Trackbacks
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]的值发生了变化。

从上面的分析,我们可以得出结论:对于引用类型,其实参数传递时仍然是按值传递的;当然,按引用传递也不是完全没有道理,只是参考对象不是引用类型本身,而是引用类型所指向的对象。
posted on 2007-01-05 20:34 lotusswan 阅读(574) 评论(0)  编辑  收藏 所属分类: Tiger学习笔记

只有注册用户登录后才能发表评论。


网站导航: