Java中关于引用类型传值的例题_【转】Java经典问题:传值与传引用?

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

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

1 /**

2 * @(#)Swap.java3 *4 *5 *@author

6 *@version1.00 2007/1/57 */

8

9

10 public classSwap {11

12 publicSwap() {}13

14 public static voidmain(String[] args) {15 Changer c = newChanger();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 classChanger {30 public < T > voidswap(T a, T b) {31 T temp =a;32 a =b;33 b =temp;34 }35

36 public < T > voidswap(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个,其布局可以用下图所示:

c959ee5993278862b23df0a600a9032a.png

当调用swap(stra, strb)函数时,传递的是引用类型stra、strb的拷贝值,因此函数中任何对参数的改变都不会影响到stra和strb的值;而调用swap(strArr)时,传递的是strArr的拷贝值,程序中对参数的任何改变仍然不会影响到strArr的值,然而swap(T[] t)中改变的并不是strArr的值,而是strArr[0]和strArr[1]的值,也就是引用类型strArr所指向的对象的值,因而strArr[0]和strArr[1]的值发生了变化。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值