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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 烟花雨 中级黑马   /  2013-10-30 17:09  /  956 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 烟花雨 于 2013-10-31 09:17 编辑

为什么下面注释的方法不能实现互换??
public class Str {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                int[] arr={5,6,1,9};
                paixu(arr);
                for(int s:arr){
                        System.out.println(s);
                }

        }

        private static void paixu(int[] arr) {
                // TODO Auto-generated method stub
                for(int i=0;i<arr.length-1;i++){
                        for (int j = i+1; j < arr.length; j++) {
                                if(arr>arr[j])
                                        swap(arr,i,j);
                                        //swap(arr,arr[j]);  为什么这个方法不能实现互换???
                        }        
                }
        }
/*        private static void swap(int i,int j) {
                int temp = i;
                i = j;
                j = temp;
        }
*/
        private static void swap(int[] arr, int i, int j) {
                int temp = arr;
                arr = arr[j];
                arr[j] = temp;
        }
}        

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

4 个回复

倒序浏览
因为形参与实参不符

private static void swap(int[] arr, int i, int j)

swap(arr,arr[j]);  改为  →  swap(arr,i,j);

评分

参与人数 1黑马币 +3 收起 理由
黄炳期 + 3

查看全部评分

回复 使用道具 举报
lz,你的本意是想通过角标的交换来实现数组中数的调换吗?我刚刚试了一下,这是不可以的,
我把你的代码稍微改一下,
  1. <p>class test
  2. { </p><p>  public static void main(String[] args) {
  3.                  // TODO Auto-generated method stub
  4.                  int[] arr={5,6,1,9};
  5.                  paixu(arr);
  6.                  for(int s:arr){
  7.                          System.out.print(s);
  8.                  }</p><p>         }</p><p>         private static void paixu(int[] arr) {
  9.                  // TODO Auto-generated method stub
  10.                  for(int i=0;i<arr.length-1;i++){
  11.                          for (int j = i+1; j < arr.length; j++) {
  12.                                  if(arr[i]>arr[j])
  13.    
  14.     System.out.println("i="+i+" "+"arr[i]="+arr[i]+" "+"j=" +j+" "+"arr[j]="+arr[j]); //这句代码是输出交换前 i 和  j 的值
  15.                                        //  swap(arr,i,j);
  16.                                       swap(i,j); // 为什么这个方法不能实现互换???
  17.     System.out.println("i="+i+" "+"arr[i]="+arr[i]+" "+"j=" +j+" "+"arr[j]="+arr[j]);//这句代码是输出交换后 i 和  j 的值
  18.                          }        
  19.                  }</p><p>
  20.          }
  21.          private static void swap(int i,int j) {
  22.   System.out.println(i+" "+j);    //交换前 i 和 j的值
  23.                  int temp = i;
  24.                  i = j;
  25.                  j = temp;
  26.   System.out.println(i+" "+j); //交换后 i 和 j的值
  27.   
  28.   
  29.          }

  30.          private static void swap(int[] arr, int i, int j) {
  31.                  int temp = arr[i];
  32.                  arr[i] = arr[j];
  33.                  arr[j] = temp;</p><p>         }</p><p>
  34. }

  35. </p><p> </p>
复制代码
通过运行这个代码,就发现是局部变量的问题,因为在swap方法中,i 和 j 的值的确是交换了,
可是出来swap方法,之前在栈中开辟的变量空间就自动消失了,所以交换的结果就显示不出来
而数组是在堆中开辟空间,是有地址去指向的,所以改变数组的值,在调用数组的方法没结束前,
数组都会存在,所以第二个方法就可以成功交换

这是我的一点想法,如果有什么不对的请各位指出,谢谢了

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报 1 0
明确一点:java中只有值传递,没有引用传递

评分

参与人数 1黑马币 +3 收起 理由
黄炳期 + 3

查看全部评分

回复 使用道具 举报
楼主你好,如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的链接
http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马