我用了3种方式试验,都没有成功,请高手指点
1,直接写函数交换
change(int a,int b)
{
  int c;
  c = a;
  a = b;
  b = c;
}
不行,而且我知道肯定不行.因为是传值方式,而不是传址方式.
2,用原子数据包装类来实现.
change(Integer a,Integer b)
{
  Integer c;
  c = a;
  a = b;
  b = c;
}
但是结构还是不行,我怀疑是因为是因为原子数据包装类的不可改变性造成的.
于是我又试验了第三种方法.
3,创建一个对象,对象中保存着数值,然后交换两个对象.
class A
{
int a;
public void setA(int a)
{
this.a = a;
}
public int getA()
{
return this.a;
}
};
class Test 
{
public static void change(A a,A b)
{
A c;
c =a;
a = b;
b = c;
}
public static void main(String[] args) 
{
A a = new A();
A b = new A();
a.setA(12);
b.setA(14);
change(a,b);
System.out.println("a is "+a.getA()+",b is "+b.getA());
System.out.println("Hello World!");
}
}
但是结果输出却是 :
a is 12,b is 14
----------------
这是为什么,请大虾帮助一下!

解决方案 »

  1.   

    class A
    {
    int a;
    public void setA(int a)
    {
    this.a = a;
    }
    public int getA()
    {
    return this.a;
    }
    };
    class Test 
    {
    public static void change(A a,A b)
    {
    int c;
    c =a.getA();
    a.setA(b.getA());
    b.setA(c);
    }
    public static void main(String[] args) 
    {
    A a = new A();
    A b = new A();
    a.setA(12);
    b.setA(14);
    change(a,b);
    System.out.println("a is "+a.getA()+",b is "+b.getA());
    System.out.println("Hello World!");
    }
    }
      

  2.   

    是2个对象,但是作用域不对,你把main方法的对象提到类下
      

  3.   

    java里面,int是传值,而对象是传址的。
      

  4.   

    为什么不看看书?(java编程思想说得很深刻)你一直在交换地址!zhangxf(反我恕) 正解
      

  5.   

    可以用数组实现.int [] a = {10};
    int [] b = {20};void swap (int [] a,int [] b) {
        int t = a[0];
        a[0] = b[0];
        b[0] = t;
    }
    //a[0] == 20;
    //b[0] == 10;
      

  6.   

    如果按你的方式就要这样写:
    class A
    {
    int a;
    public void setA(int a)
    {
    this.a = a;
    }
    public int getA()
    {
    return this.a;
    }
    };
    class Test 
    {
        static private A a = new A();
        static private A b = new A();
    public static void change()
    {
    A c;
    c =a;
    a = b;
    b = c;
    }
    public static void main(String[] args) 
    {
                      a.setA(12);
                      b.setA(14);
    change();
    System.out.println("a is "+a.getA()+",b is "+b.getA());
    System.out.println("Hello World!");
    }
    }
      

  7.   

    zhangxf(反我恕) lydvqq(碧水情缘♀黑哥)  已经告诉你正解了
    同上
      

  8.   

    不过:
    lydvqq(碧水情缘♀黑哥)把我的意思误解了,把
    A a = new A();
    A b = new A();
    设为全局变量当然可以了.这不用说了zhangxf(反我恕)的解释还可以,但我不想这样交换!为什么:
    class Test 
    {
    public static void change(int a[],int b[])
    {
    int c ;
    c = a[0];
    a[0] = b[0];
    b[0] = c;
    }
    public static void main(String[] args) 
    {
    int a[]= new int[1];
    int b[]= new int[1];
    a[0] = 1;
    b[0] = 2;
    change(a,b);
    System.out.println("a[0] "+a[0]+",b[0] is "+b[0]);
    System.out.println("Hello World!");
    }
    }
    能够实现整形值的转换,而
    class A
    {
    int a;
    public void setA(int a)
    {
    this.a = a;
    }
    public int getA()
    {
    return this.a;
    }
    };
    class Test 
    {
    public static void change(A a,A b)
    {
    A c;
    c =a;
    a = b;
    b = c;
    }
    public static void main(String[] args) 
    {
    A a = new A();
    A b = new A();
    a.setA(12);
    b.setA(14);
    change(a,b);
    System.out.println("a is "+a.getA()+",b is "+b.getA());
    System.out.println("Hello World!");
    }
    }
    却不能?
    请大家解释一下!
      

  9.   

    还有就是为什么用原子数据包装类不能实现两个整形数据的交换?
    即:
    change(Integer a,Integer b)
    {
      Integer c;
      c = a;
      a = b;
      b = c;
    }
      

  10.   

    不是不能实现,而是你实现的方式不对。change(Integer a,Integer b)
    {
      Integer c;
      c = a;
      a = b;
      b = c;
    }
    你这个做法,虽然是用的包装类来交换的数据,但是进入change函数的时候,a和b是change函数内的局部变量,他们引用的是你传入的两个Integer类型,你再函数内部交换了a和b,也只是把局部变量引用的对象交换了,并没有达到你想要的结果。
    贴篇文章给搂住看看估计就能明白了。
      

  11.   

    http://www.ublog.cn/user1/11/archives/2005/1948.htmlPS:刚才一不小心点了发出回复,忘记贴URL了。
      

  12.   

    只要是对象传的就是地址,Integer无法实现的原因与你前面用类的原因一样。你只是改变了change方法中的a,b的引用。主函数中的并未改变。
    首先,你要知道change中的a,b与主函数中的不同。为了方便理解,可以把a,b想象成c中的指针,change中的a与主函数中的a指向相同的内存空间。改变change中的a的指向,与主函数中的a毫无关系。
      

  13.   

    我一般就直接这样写
    //略去
    int a;
    int b;
    a=a+b;
    b=a-b;
    a=a-b;
    //略去
      

  14.   

    class A
    {
    int a;
    public void setA(int a)
    {
    this.a = a;
    }
    public int getA()
    {
    return this.a;
    }
    };
    class Test 
    {
    public static void change(A a,A b)
    {
      int tmpA = a.getA();
      int tmpB = b.getA();
      b.setA(tmpA);
      a.setA(tmpB);
    }
    可以了,你函数中传过来的a,b只是引用的拷贝,你把它指向其他的句柄当然原来引用指向的类实例不会变了。
      

  15.   

    一个很简单的办法
    trave(int a,int b){
    a=a+b;
    b=a-b;
    a=a-b;
    }
    这样就可以了.