在java中如何实现两个整形值的交换

tgz501 2006-04-04 07:54:32
我用了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
----------------
这是为什么,请大虾帮助一下!

...全文
981 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
WHW1984 2006-04-05
  • 打赏
  • 举报
回复
一个很简单的办法
trave(int a,int b){
a=a+b;
b=a-b;
a=a-b;
}
这样就可以了.
qingyuan18 2006-04-05
  • 打赏
  • 举报
回复
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只是引用的拷贝,你把它指向其他的句柄当然原来引用指向的类实例不会变了。
tgz501 2006-04-04
  • 打赏
  • 举报
回复
不过:
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!");
}
}
却不能?
请大家解释一下!
tgz501 2006-04-04
  • 打赏
  • 举报
回复
谢谢大家.明白!
bgceft 2006-04-04
  • 打赏
  • 举报
回复
zhangxf(反我恕) lydvqq(碧水情缘♀黑哥) 已经告诉你正解了
同上
moremoney 2006-04-04
  • 打赏
  • 举报
回复
楼上的都别说了,我明白了,楼主一直试图修改两个局部变量
lydvqq 2006-04-04
  • 打赏
  • 举报
回复
如果按你的方式就要这样写:
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!");
}
}
pauliuyou 2006-04-04
  • 打赏
  • 举报
回复
可以用数组实现.

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;
topirol 2006-04-04
  • 打赏
  • 举报
回复
为什么不看看书?(java编程思想说得很深刻)你一直在交换地址!zhangxf(反我恕) 正解
pigengler 2006-04-04
  • 打赏
  • 举报
回复
java里面,int是传值,而对象是传址的。
moremoney 2006-04-04
  • 打赏
  • 举报
回复
是2个对象,但是作用域不对,你把main方法的对象提到类下
zhangxf 2006-04-04
  • 打赏
  • 举报
回复
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!");
}
}
moremoney 2006-04-04
  • 打赏
  • 举报
回复
啊,对是2个对象 ,也看晕了
moremoney 2006-04-04
  • 打赏
  • 举报
回复
因为你打印的对象合你交换的对象不是同样的对象,也就是说你定义了4个对象

另外不知道你要交换的具体是什么,是地址还是值?
kuenpengmu 2006-04-04
  • 打赏
  • 举报
回复
我一般就直接这样写
//略去
int a;
int b;
a=a+b;
b=a-b;
a=a-b;
//略去
gs_lt 2006-04-04
  • 打赏
  • 举报
回复
呵呵,没有错啊,一直换的是地址而不是值。。。
adverse 2006-04-04
  • 打赏
  • 举报
回复
只要是对象传的就是地址,Integer无法实现的原因与你前面用类的原因一样。你只是改变了change方法中的a,b的引用。主函数中的并未改变。
首先,你要知道change中的a,b与主函数中的不同。为了方便理解,可以把a,b想象成c中的指针,change中的a与主函数中的a指向相同的内存空间。改变change中的a的指向,与主函数中的a毫无关系。
foxty 2006-04-04
  • 打赏
  • 举报
回复
http://www.ublog.cn/user1/11/archives/2005/1948.html

PS:刚才一不小心点了发出回复,忘记贴URL了。
foxty 2006-04-04
  • 打赏
  • 举报
回复
不是不能实现,而是你实现的方式不对。

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

tgz501 2006-04-04
  • 打赏
  • 举报
回复
还有就是为什么用原子数据包装类不能实现两个整形数据的交换?
即:
change(Integer a,Integer b)
{
Integer c;
c = a;
a = b;
b = c;
}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧