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

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

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

  /***@(#)Swap.java***@author*@version1.002007/1/5*/ publicclassSwap{ publicSwap(){} publicstaticvoidmain(String[]args){ Changerc=newChanger(); Stringstra=”Mighty”; Stringstrb=”Mouse”; c.swap(stra,strb); System.out.println(stra+””+strb); String[]strArr=newString[2]; strArr[0]=stra; strArr[1]=strb; c.swap(strArr); System.out.println(strArr[0]+””+strArr[1]); } staticclassChanger{ public<T>voidswap(Ta,Tb){ Ttemp=a; a=b; b=temp; } public<T>voidswap(T[]t){ if(t.length<2){ System.out.println(“error!”); return; } Ttemp=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]的值发生了变化。

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

一个今天胜过两个明天

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

相关文章:

你感兴趣的文章:

标签云: