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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Himoriarty 中级黑马   /  2015-4-14 17:49  /  6870 人查看  /  25 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

2黑马币
public class Test
{
          public static void main(String[] args)
          {
                       int[] a = {1,2};
                       swap(a[0],a[1]);
                      System.out.println(a[0] + " " + a[1]);
           }
          public static void swap(int n1, int n2)
           {
                      int temp = n1;
                       n1 = n2;
                       n2 = temp;
           }
}
为什么结果是没交换?

25 个回复

正序浏览
可是这样也只是交换两个,有点简单了,如果全部交换,用循环遍历,不管多少个都给交换。
回复 使用道具 举报
没有返回值,就等于是你干了活,啥都没有给老板汇报一样,要对返回值进行接收;而且你传进去的是元素,不是引用,要是你不返回值,可以把数组的引用传进去就OK了;
回复 使用道具 举报
区分形参,实参
回复 使用道具 举报
break 中级黑马 2015-4-16 22:06:14
22#
不能水啊   也在学习
回复 使用道具 举报
你交换的是形式参数的值,并没有改变实际参数

public class swape
{
          public static void main(String[] args)
          {
                       int[] a = {1,2};
                       swap(0,1,a);
                      System.out.println(a[0] + " " + a[1]);
           }
          public static void swap(int n1, int n2, int a[])
           {
                      int temp = a[n1];
                       a[n1] = a[n2];
                       a[n2] = temp;
           }
}
回复 使用道具 举报
synhm 中级黑马 2015-4-16 19:59:57
20#
我是来学习的。。。。
回复 使用道具 举报
数组是引用数据类型,所以你传参的时候也应该用引用数据类型来接收,
你所写的只是把int类型的a,b交换了
可以这样写:
public class Aa {
public static void main(String[] args) {
  int [] a= {1,2};
  method(a);
  System.out.println(a[0]+" "+a[1]);
}
public static void method(int[] b) {
  
  int temp = b[0];
  b[0]= b[1];
  b[1]=temp;
}

}

回复 使用道具 举报
数组是引用数据类型,所以你传参的时候也应该用引用数据类型来接收,
你所写的只是把int类型的a,b交换了
可以这样写:
public class Aa {

        public static void main(String[] args) {
                int [] a= {1,2};
                method(a);
                System.out.println(a[0]+" "+a[1]);
        }

        public static void method(int[] b) {
               
                int temp = b[0];
                b[0]= b[1];
                b[1]=temp;
        }


}
回复 使用道具 举报
你这交换没有实质的把数组内存的地址交换,只是把两个数值交换了吗,没有意义
回复 使用道具 举报
你的swap方法中,只是只换了两个数的值,但是没有返回给要操作的数组,系统并不知道你要换哪个数组中的元素。
1.要么向二楼那样传入需要操作的数组。
2.要么你就直接把换值操作直接写出,不再定义函数去完成换值动作。
回复 使用道具 举报
接受参数应该是数组
回复 使用道具 举报
学习了
回复 使用道具 举报
君嘘 发表于 2015-4-14 22:01
这里有个概念:
基本数据类型,形式参数的改变不影响实际参数的改变。
引用数据了性,形式参数的改变影响实 ...

+10086     
回复 使用道具 举报
class Swap
{
        public static void main(String[ ] args)
        {
                int[] a = {1,2};
                System.out.println(a[0]+" " + a[1]);
                swap(a);
                System.out.println(a[0]+" " + a[1]);
        }

        public static void swap(int[] arr)
        {
                int tmp = arr[0];
                arr[0] = arr[1];
                arr[1] = tmp;
        }
}

测试输出结果
1 2
2 1
回复 使用道具 举报

public class Test
{
          public static void main(String[] args)
          {
                       int[] a = {1,2};
                       swap(a[0],a[1]);
                      System.out.println(a[0] + " " + a[1]);
           }
          public static void swap(int n1, int n2)
           {
                      int temp = n1;
                       n1 = n2;
                       n2 = temp;
           }
}

void swap(int n1 ,int n2)函数中形参n1,n2其实是主函数中数组 元素a[0] a[1]的的备份,
你交换的是n1,n2内存里面的值,并没有动a[0],a[1]的修改内存,所自然就没有交换了的。
将函数改为这样
void swap(int [ ] arr)
{
     int tmp = arr[0];
    arr[0] = arr[1];
  arr[1] = tmp;
}
在主函数中将数组的引用a传递给arr,那么arr也可以引用主函数中数组的内存,
那么在swap中的arr[0]和主函数 的a[0]其实是同一个存储单元
arr[1]和主函数中的a[1]是同一个存储单元,那么就可以就可以在调用函数中实现主函数中的数组的值交换了。




回复 使用道具 举报
变量作用域的问题,n1和n2是形式参数且交换了,但实际参数(数组)没变。
回复 使用道具 举报
君嘘 发表于 2015-4-14 22:01
这里有个概念:
基本数据类型,形式参数的改变不影响实际参数的改变。
引用数据了性,形式参数的改变影响实 ...

非常感谢,明白了
回复 使用道具 举报
交换内容没有返回啊,只是函数内部交换了 回主函数没交换
回复 使用道具 举报
这么说 你现在往方法里面传递的是具体的数值 而不是数组在内存中的引用变量 无论你下面怎么操作 只要不是 通过引用地址改变的值都是不会改变的 所以上面的值你在打印的时候还是原先的值  除非你从新指向新的地址值
但是内存中原先的值也不会改变 只是会等垃圾回收机制来回收他
回复 使用道具 举报
解决了没有,没有解决我就告诉你,一张图包懂!
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马