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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 左建飞 中级黑马   /  2012-7-24 17:59  /  1786 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public static void selectSort(int[] arr)
  2. {
  3.     for (int x = 0; x < arr.length-1; x++)
  4.       {
  5.            for (int y = x+1; y < arr.length; y++)
  6.                  {
  7.                      if (arr[x]>arr[y])
  8.                          {
  9.                               ChangePlace.changePlace2(arr[x],arr[y]);
  10.                          }
  11.                  }
  12.         }
  13.         }
复制代码
以上为我的排序方法。调用了ChangePlace类中的交换方法。
  1. public class ChangePlace
  2. {
  3.         public static void changePlace(int[]arr,int a,int b)
  4.   {
  5.      int temp;
  6.      temp=arr[a];
  7.      arr[a]=arr[b];
  8.      arr[b]=temp;
  9.   }
  10.         public static void changePlace2(int a,int b)
  11.   {
  12.      int temp=a;
  13.      a=b;
  14.      b=temp;
  15.   }
  16. }
复制代码
这两个交换位置的方法只有changePlace才起作用,数组会排序,但是用changePlace2时就不起作用,数组不会排序。
这是为什么?

4 个回复

倒序浏览
在方法changePlace(int[]arr,int a,int b)中,参数arr是引用传递,所以你在方法内部对arr作的改动是有效的。
但是changePlace2(int a,int b)中的a和b都是值传递,实质是相当于在方法内部又声明了两个变量a和b,你对他们的改动是不会影响到外面的数据的。

希望对你有帮助........

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
changePlace2中你只传递了两个形式参数,根本没有数组,怎么交换数组的元素呢,形参和实参,在changePlace2中是交换了两个形参,你没有传递数组,那么只是两个变量的交换,与数组没关系。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
changePlace(int[]arr,int a,int b)中参数arr是引用传递
但changePlace2(int a,int b)中参数都值传递

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这里涉及到引用数据类型和基本数据类型的作为参数的值传递是否发生改变。
java中其实只有值传递。当参数是基本数据类型的时候,他传递的是基本数据类型的值。
当参数是引用数据类型时,比如你里面的数组在某个角标的值。他传递的是引用数据类型的数据的
地址值。所以就产生你你这里的问题。当把数组里面的arr[x]或arr[y],作为参数传递时,传递的是
他在堆内存中的地址值。所以直接修改了堆内存中的数据。当方法用完了退栈了他已保存,
而你的changePlace2方法传递的是基本数据类型的数,int型的。他传进去的arr[x]或arr[y] 直接转成int型的数。
再运行方法。他的生命周期只在方法运行时,当这个方法运行完了,退栈了,他也就消失了,而没有指向堆内存。
所以他们的值并没有换。所以changePlace2无法实现。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马