A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何仕映 中级黑马   /  2013-3-13 14:40  /  1224 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 何仕映 于 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. */
复制代码

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1 代码请用插入代码

查看全部评分

5 个回复

倒序浏览
调用第二个方法,你交换的是传进去的两个数,而原先数组里面的顺序并没有交换!再不明白的话,就详细点,数组是存放在堆中的,你调用方法二,只是取到数组里面的值在栈中交换,而存放在堆中的数组的顺序并没有改变!

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
第一种方法操作对象 是数组。。所以数组改变了。。
第二种方法操作对象 是数组中的两个数,x y 的值互换了,但是这个不关数组的事。。

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1 总是回答,你就没问题?

查看全部评分

回复 使用道具 举报
不知道C语言你会不会,传址和传值是不一样的,swap_1就是传址,是把两个内存空间的地址给换了,说白了,就是把它们的位置给调换了,而swap_2是传值,只是传进去了两个数值,分别给变量x和y了,变量的值换了,跟数组arry1一点关系都没有,所以没变

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
java里函数参数的传递规则是:基本类型就是其中值的复制,引用类型就是引用值地址的复制。值的复制原来的值不会发生改变,而地址的复制原来的值则发生了改变!引用类型包括数组,类,接口。所以方法一里面的数据交换了而方法二里面的数据没变。

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
若仍有问题,请继续追问;没问题的话,请将帖子的分类改成【已解决】~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马