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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 焚雨成灰 中级黑马   /  2014-3-12 20:12  /  1774 人查看  /  13 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 焚雨成灰 于 2014-3-12 20:39 编辑

代码如下:
class Test
{
        public static void swap(A x, A y)//互换操作
        {
                A temp = x;
                x = y;
                y =temp;
        }
        public static void main(String[] args)
        {
                A m = new A(6);
            A n = new A(10);
                /*
                m = n;
                m.run();
                输出结果为10
                */

                /*
                A p = m;
                p.run();
                输出结果为6
                */
                swap(m,n);
                m.run(); //输出结果为6,引用内容未互换
}

class A
{
        private int a;
        A(int a)
        {
                this.a = a;
        }
        void run()
        {
                System.out.println(a);
        }
}


评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

13 个回复

正序浏览
java 语言是严谨的,你调用swap()方法互换引用变量的值,只在swap()方法中有效,而在main方法中无效。因为你调用swap()方法根本就没有把结果返回来。相当于白干。因此,当我们对一个数据进行修改后,并用修改后的数据进行运算,一定要有返回值。
  1. class Test
  2. {               
  3.                     
  4.          public static A swap(A x, A y)//互换操作
  5.         {
  6.                  A temp = x;
  7.                  x = y;
  8.                  y =temp;
  9.                      return x;
  10.          }
  11.          public static void  main(String[] args)
  12.          {            
  13.                    A m = new A(6);
  14.                A n = new A(10);
  15.                A x=swap(m,n);
  16.                     x.run(); //输出结果为10
  17.            }
  18. }

  19. class A
  20. {
  21.          private int a;
  22.          A(int a)
  23.          {
  24.                  this.a = a;
  25.          }
  26.          void run()
  27.          {
  28.                  System.out.println(a);
  29.          }
  30. }
复制代码
回复 使用道具 举报
焚雨成灰 发表于 2014-3-12 20:22
为什么c语言里可以

c语言中是用到了指针,指针指向的是同一块内存空间,所以指针指向的内容改变了,那么原本的数据就改变了,但是java中swap(A x, A y),x和y都是引用,也就是x和y里面存放的是实参传递过来实体的地址,进行互换操作之后,x和y指向了互换后的实体,但是外面实参所指向的实体并没有改变,所以没有达到互换效果。如果想要达到c语言里的效果,可以在swap(A x, A y)里面把实体里的数据互换即可。
改变效果如下:

  1. public static void swap(A x, A y)//互换操作
  2.         {        /*
  3.                 A temp = x;
  4.                 x = y;
  5.                 y =temp;
  6.                 */
  7.                 int temp = x.a;//要完成此操作需把类A的属性a改成非私有的
  8.                 x.a = y.a;        //或者在类A中设置一个getA()方法
  9.                 y.a = temp;
  10.         }
复制代码
回复 使用道具 举报
主要是进入方法后,x,y参数指向了m,n对象的位置,之后再改变只是改变x,y的指向,而不涉及m,n

请和用函数改变对应地址种a的值区分开。
回复 使用道具 举报
volvoxc 发表于 2014-3-12 20:19
首先这里传入的参数都是引用类型,你把m的地址值传给了x,n的地址值传给了y,然后在方法中,只是把x,和y所指 ...

正解!!
回复 使用道具 举报
主要是进入方法后,x,y参数指向了m,n对象的位置,之后再改变只是改变x,y的指向,而不涉及m,n
回复 使用道具 举报
代码动了很多,写错
回复 使用道具 举报
2.你应该想交换是是6和10,你可以变一下,代码懂了很多,
class Test
{
        public static void swap(int x, int y)//互换操作 1.更改
        {
                int temp = x;
                x = y;
                y =temp;
                                System.out.println("m =6..."+x+"   "+"n=10..."+y);
        }
        public static void main(String[] args)
        {
                A m = new A(6);
                          A n = new A(10);
                /*
                m = n;
                m.run();
                输出结果为10
                */

                /*
                A p = m;
                p.run();
                输出结果为6
                */
                                //2.更改
                                int x= m.a;
                                int y = n.a;
                swap(x,y);
               // m.run(); //输出结果为6,引用内容未互换
                }
}

class A
{//更改
          int a;
        A(int a)
        {
                this.a = a;
        }
        void run()
        {
                System.out.println(a);
        }
}
回复 使用道具 举报
1.你的swap是有用的,你的m,n是一个引用型变量,它交换的是地址值。代码可以看出x.y有变化(那是哈希值,不是地址值,但确实变了)
2.你应该想
   public static void swap(A x, A y)//互换操作
        {
                        System.out.println("x.."+x );
                        System.out.println("y..."+y );
                A temp = x;
                x = y;
                y =temp;
                        System.out.println("x..."+x );
                        System.out.println("y..."+y );
        }

x..A@2f0f94a0
y...A@27e6ac83
x...A@27e6ac83
y...A@2f0f94a0
回复 使用道具 举报
焚雨成灰 发表于 2014-3-12 20:22
为什么c语言里可以

C语言里面传的应该是地址    swap( inx *x,int *y)
回复 使用道具 举报
榨菜 发表于 2014-3-12 20:29
下面是我的理解,若有不对,请多多指出。

:o幸苦了
回复 使用道具 举报
下面是我的理解,若有不对,请多多指出。


回复 使用道具 举报 1 0
volvoxc 发表于 2014-3-12 20:19
首先这里传入的参数都是引用类型,你把m的地址值传给了x,n的地址值传给了y,然后在方法中,只是把x,和y所指 ...

{:3_60:}为什么c语言里可以
回复 使用道具 举报
首先这里传入的参数都是引用类型,你把m的地址值传给了x,n的地址值传给了y,然后在方法中,只是把x,和y所指向的内容换了,而m,n指向的内容并没有换啊。
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马