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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

public static void main(String[] args)
    {
        int m = 2;
        int n = 3;
        int x = 2;
        int y = 3;
        if(m<n)
        {
            int temp = m;
            m = n;
            n = temp;
        }
        System.out.println("m::"+m+"...n::"+n);//为什么在这里实现了m、n的交换位置
        mySwap(x,y);
        System.out.println("x::"+x+"...y::"+y);//为什么在这里不能实现x、y的交换位置
        
    }
    public static void mySwap(int m,int n)
    {
        if(m<n)
        {
            int temp = m;
            m = n;
            n = temp;
        }
    }
我真的很诧异!!!!!!

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 赞一个!

查看全部评分

10 个回复

倒序浏览
本帖最后由 郑正华 于 2012-8-13 10:44 编辑

这里有个形参和实参的概念,m和n交换了位置是因为你上面的if语句对m和n进行了位置交换的操作,而操作的m和n值就定义在了你这个main方法体里面了,对于这个if语句来说,m和n就是实参。
x和y没有实现位置的交换是因为你调用了mySwap方法,往这个方法里传了两个形参x和y,这个方法只是对传入的参数进行了位置交换的操作,但并没有对main方法体中的x和y实值做改变。
不知楼主是否明白?
回复 使用道具 举报
  1. public static void main(String[] args)
  2.     {
  3.         int m = 2;
  4.         int n = 3;
  5.         int x = 2;
  6.         int y = 3;
  7.         if(m<n)
  8.         {
  9.             int temp = m;
  10.             m = n;
  11.             n = temp;
  12.         }
  13.         System.out.println("m::"+m+"...n::"+n);//这里能实现交换m和n的值是因为你的变量就声明在主函数中,而你交换m、n的值也是在此函数中实现的,无需将参数传递给其他函数
  14.         mySwap(x,y);
  15.         System.out.println("x::"+x+"...y::"+y);//这里你你调用了mySwap(x,y)方法,你需要将x和y的值作为参数传递给此函数,而在java中基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的。还有在Java中对象作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数。
  16.         
  17.     }
  18.     public static void mySwap(int m,int n)
  19.     {
  20.         if(m<n)
  21.         {
  22.             int temp = m;
  23.             m = n;
  24.             n = temp;
  25.         }
  26.     }
复制代码

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 杨康 于 2012-8-13 10:48 编辑
  1. public static void main(String[] args)
  2. {
  3. int m = 2;
  4. int n = 3;
  5. int x = 2;
  6. int y = 3;
  7. if(m<n)//这里的if(m < n){},是在对m和n进行操作,通过第三方变量,改变了m和n在内存中的值。

  8. {
  9. int temp = m;
  10. m = n;
  11. n = temp;
  12. }
  13. System.out.println("m::"+m+"...n::"+n);
  14. mySwap(x,y);//而这里的x和y只是将自己的值传递给mySwap(int m, int n)方法,自己本身在栈内存中并没有发生变化。
  15. System.out.println("x::"+x+"...y::"+y);
  16. }
  17. public static void mySwap(int m,int n)
  18. {
  19. if(m<n)
  20. {
  21. int temp = m;
  22. m = n;
  23. n = temp;
  24. }
  25. }
复制代码
回复 使用道具 举报
郑正华 发表于 2012-8-13 10:42
这里有个形参和实参的概念,m和n交换了位置是因为你上面的if语句对m和n进行了位置交换的操作,而操作的m和n ...

还是感觉有点晕,在老毕的视频中不是把交换位置封装成函数了吗?难道我跟他写的不一样吗?现在不方便看视频,还请帮我详细一点的解决一下,非常感谢啦!
回复 使用道具 举报
王少岩 发表于 2012-8-13 11:23
还是感觉有点晕,在老毕的视频中不是把交换位置封装成函数了吗?难道我跟他写的不一样吗?现在不方便看视 ...

你看的是毕老师的哪个视频?第几天的第几节?我查明真相去....
回复 使用道具 举报
郑正华 发表于 2012-8-13 11:32
你看的是毕老师的哪个视频?第几天的第几节?我查明真相去....

我记得就是数组排序那块吧,具体哪个我说不准,我现在上班。。视频都在家不方便看啊。。。
回复 使用道具 举报
这个就是“引用传递”和“值传递”的区别了,int型参数为值传递,不会改变原来实际参数的值。。。,这个你得去看看值类型和引用类型的区别了。。。:P
回复 使用道具 举报
黄敏 中级黑马 2012-8-13 12:45:40
9#
public static void main(String[] args)
    {
        int m = 2;
        int n = 3;
        int x = 2;
        int y = 3;
        if(m<n)
        {
            int temp = m;
            m = n;
            n = temp;
        }
        System.out.println("m::"+m+"...n::"+n);//通过第三方变量temp,交换了m和你的值了,这时候的确是m=3,n=2.
        mySwap(x,y);//程序执行到这的时候,把x=2,y=3这两个成员变量给了mySwap方法并作为局部变量在mySwap方法中使用,方法里的确改变了他们的位置,也就是调用这个方法只是改变了它内部变量的位置,方法外面管不用了,就是楼上说的。
        System.out.println("x::"+x+"...y::"+y);//为什么在这里不能实现x、y的交换位置  //这个输出语句还是用的main方法中的变量,看到的还是x=2,y=3 ,跟你调用mySwap方法,没关系的,你要是把这句话放在mySwap方法中才会看到调换位置了
        
    }
    public static void mySwap(int m,int n)//这只是引用了x,y的值给了m和n,里面改变的是m,n的值,并不是x和y,这就好比,我(main)有一份考试题答案,你(mySwap)拷贝了
我(main)一份自己用,至于你(mySwap)随便怎么改,我管不了,我看到的只是你改变了你拷贝我的那份答案,我的这份还是完好不变的,我看到的还是我自己的,你的就是形参,我的就是实参

不知道你明白了吗。希望对你有帮助
    {
        if(m<n)
        {
            int temp = m;
            m = n;
            n = temp;
        }
    }

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 赞一个!打的比方还不错!

查看全部评分

回复 使用道具 举报
黄敏 发表于 2012-8-13 12:45
public static void main(String[] args)
    {
        int m = 2;

明白了,谢谢
回复 使用道具 举报
谢谢各位,问题已解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马