黑马程序员技术交流社区

标题: 关于函数调用的问题 [打印本页]

作者: 何仕映    时间: 2013-3-13 14:40
标题: 关于函数调用的问题
本帖最后由 何仕映 于 2013-3-15 09:33 编辑
  1. /*
  2.          疑问:两个交换方法用的都是同一种思想,为什么第二种方法交换后不能在交换函数之外将交换的结果打印出来呢?请各位帮帮小弟。谢谢
  3. */
  4. class ArrTest   {
  5. public static void main(String[] args)//主函数
  6. {
  7.   int[] arr = {1,2}; //定义两个数组
  8.   int[] arr1 = {3,4};
  9.   print("arr未交换前的元素顺序",arr);  //打印未交换前数组中的元素
  10.   print("arr1未交换前的元素顺序",arr1);
  11.   swap_1(arr,0,1);     //调用交换方法一,并打印交换后的结果
  12.   print("arr调用交换方法一后的元素顺序",arr);
  13.   swap_2(arr1[0],arr1[1]);   //调用交换方法二,并打印交换后的结果
  14.   print("arr1调用交换方法二后的元素顺序",arr1);
  15. }

  16. //将两个数进行交换方法一
  17. public static void swap_1(int[] arr,int x,int y)
  18. {
  19.   int temp = arr[x];
  20.   arr[x] = arr[y];
  21.   arr[y] = temp;  
  22. }
  23. //将两个数进行交换方法二
  24. public static void swap_2(int x,int y)
  25. {
  26.   int temp = x;
  27.   x = y;
  28.   y = temp;  
  29. }
  30. //将数组输出
  31. public static void print(String s,int[] arr)
  32. {
  33.   System.out.print(s+"arr = {");
  34.   for (int i=0; i<arr.length; ++i)
  35.   {
  36.    if (i != arr.length-1)
  37.    {
  38.     System.out.print(arr+" ");
  39.    }
  40.    if (i==arr.length-1)
  41.    {
  42.     System.out.print(arr+"}"+"\n");
  43.    }
  44.   }
  45. }
  46. }
  47. /*
  48. 执行结果
  49. ============================================
  50. arr未交换前的元素顺序arr = {1 2}
  51. arr1未交换前的元素顺序arr = {3 4}
  52. arr调用交换方法一后的元素顺序arr = {2 1}
  53. arr1调用交换方法二后的元素顺序arr = {3 4}
  54. ============================================
  55. */
复制代码

作者: 黑马-郑玉元    时间: 2013-3-13 14:51
调用第二个方法,你交换的是传进去的两个数,而原先数组里面的顺序并没有交换!再不明白的话,就详细点,数组是存放在堆中的,你调用方法二,只是取到数组里面的值在栈中交换,而存放在堆中的数组的顺序并没有改变!
作者: 曾钦    时间: 2013-3-13 15:00
第一种方法操作对象 是数组。。所以数组改变了。。
第二种方法操作对象 是数组中的两个数,x y 的值互换了,但是这个不关数组的事。。
作者: wanggang    时间: 2013-3-13 15:03
不知道C语言你会不会,传址和传值是不一样的,swap_1就是传址,是把两个内存空间的地址给换了,说白了,就是把它们的位置给调换了,而swap_2是传值,只是传进去了两个数值,分别给变量x和y了,变量的值换了,跟数组arry1一点关系都没有,所以没变
作者: 李罡    时间: 2013-3-13 15:38
java里函数参数的传递规则是:基本类型就是其中值的复制,引用类型就是引用值地址的复制。值的复制原来的值不会发生改变,而地址的复制原来的值则发生了改变!引用类型包括数组,类,接口。所以方法一里面的数据交换了而方法二里面的数据没变。
作者: 陈丽莉    时间: 2013-3-13 22:46
若仍有问题,请继续追问;没问题的话,请将帖子的分类改成【已解决】~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2