Java中的参数都是传值,那怎么交换两个变量的值呢。

Welkin-Hu 2005-10-10 11:03:46
最近我碰到一个经典问题,写一个函数Swan(a,b),要求交换a,b的值。
因为Java是不支持指针和传址,我想来想去,感觉这个函数还没法子简单的写出来了。

Core Java是这么说明参数传递的原则的:
A method cannot modify a parameter of primitive type (that is, numbers or Boolean values).

A method can change the state of an object parameter.

A method cannot make an object parameter refer to a new object.
...全文
970 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
shine333 2005-10-13
  • 打赏
  • 举报
回复
应改采用这样的设计思路

class A {
int x;
int y;

void swap() {
x ^= y;
y ^= x;
x ^= y;
}

}

class B {
void swap(A a) {
a.x ^= a.y;
a.y ^= a.x;
a.x ^= a.y;
}
}

而不是swap(int x, int y)
ppjjmm 2005-10-13
  • 打赏
  • 举报
回复
基本类型是没有办法改变的
arsaluo 2005-10-13
  • 打赏
  • 举报
回复
同意楼上的
maleo 2005-10-13
  • 打赏
  • 举报
回复
我的看法:
在java中如果你传入的是基本数据类型,那么你传的就是值
如果你穿的是对象,那么你传的就是引用 
我们要交换两个基本数据类型的值的话 
我们可以先转化为对应的对象类型 
然后传入函数
eureka0891 2005-10-13
  • 打赏
  • 举报
回复
不要想了,java里面是reference
对于基本类型(还有String)想交换值是不可能的
写一个linofficewhl(黑仔) 这样的程序是行的
arsaluo 2005-10-13
  • 打赏
  • 举报
回复
问一下,你这个还考虑传递对象吗?
taolei 2005-10-12
  • 打赏
  • 举报
回复
写一个函数Swan(a,b),经典问题?
这个不是java的问题,在java里没有这样的函数,也不应该这样考虑问题。
sjjf 2005-10-12
  • 打赏
  • 举报
回复
不用再讨论了,基本类型是肯定不行的。
对于函数参数。
基本类型是传值的。
对象是传引用的,但是引用的本身也是遵循传值。
这点在本质上就已经使该问题无解了:
如果两个变量是基本类型的话,那么函数只能得到调用时传入的值的拷贝体。
再怎么修改也不会影响到传入前的值。
引用也如此,如果你修改了引用的本身的指向,那么外部的对象也没有受到影响。
除非你修改引用所指向的对象。




  • 打赏
  • 举报
回复
强。得看你传进去的是什么参数了。是基本类型还是对象类型,这个区别可就大了。研究一下对象吧。
elfbobo1 2005-10-12
  • 打赏
  • 举报
回复
..........
21cg21cg 2005-10-12
  • 打赏
  • 举报
回复
y=x+y;
x=y-x;
y=y-x;
算法可以是这样的。
ebaole 2005-10-12
  • 打赏
  • 举报
回复
源代码下载!
基于j2ee平台的大型电子商务网站源代码下载 :

本源代码可以帮助大家了解大型物品买卖和交换网站如淘宝,易宝乐等网站的开发和创建。
下载地址: http://www.ebaole.com/sourcedown.html
并且开辟了一个社区专门为大家提供源代码的交流和讨论!
laou2008 2005-10-12
  • 打赏
  • 举报
回复
用数组,Point来实现。。。

import java.awt.*;
public class Shu

{
public static void change(int num[])
{
num[0]=num[1]+num[0];
num[1]=num[0]-num[1];
num[0]=num[0]-num[1];
System.out.println(num[0]+"**"+num[1]);
}
public static void change(int x,int y)
{
x=x+y;
y=x-y;
x=x-y;
System.out.println(x+"****"+y);
}
public static void change(Point pt)
{
pt.x=pt.x+pt.y;
pt.y=pt.x-pt.y;
pt.x=pt.x-pt.y;
System.out.println(pt.x+"*****"+pt.y);
}
public static void main(String[] args)
{
int num[]=new int[]{2,3};
change(num);
System.out.println(num[0]+"**"+num[1]);

int x=2;
int y=3;
change(x,y);
System.out.println(x+"****"+y);

Point pt=new Point();;
pt.x=3;
pt.y=4;
change(pt);
System.out.println(pt.x+"*****"+pt.y);
}
}
linofficewhl 2005-10-12
  • 打赏
  • 举报
回复
这样也可以吗!
public class ok
{
static void swan(int a,int b)
{
int c;
c=a;
a=b;
b=c;
System.out.println("a= "+a);
System.out.println("b=" +b);
}

public static void main()
{
swan(40,20);

}
}
f_acme 2005-10-12
  • 打赏
  • 举报
回复
实际上,问题来源于 C,而不是 Java
boyu_song 2005-10-11
  • 打赏
  • 举报
回复
你用克隆试试!
iwdc 2005-10-11
  • 打赏
  • 举报
回复
http://www.daima.com.cn/Info/55/Info32025/
Mark_Chen 2005-10-11
  • 打赏
  • 举报
回复
顶一下!
goodname008 2005-10-11
  • 打赏
  • 举报
回复
上面的代码倒是问题不大,但问题是这样做没有必要。
在C++中,代码写得紧凑的话,交换两个变量有一行就可搞定了。
如果定义个宏就更直观了。

但Java玩不了这个。
注意一下上面的代码,在main中调用swap时先new了一个Swapper对象,调用完swap后,又要对i和j分别重新赋值,有这工夫直接交换变量多好。
无论从效率还是可读性,上面的代码都是不可取的。
如果楼主只是想了解一下怎样在函数(方法)里改变参数的话,对指针和引用深入了解一下就明白了。
fu_wie 2005-10-11
  • 打赏
  • 举报
回复
太强了
加载更多回复(8)

62,614

社区成员

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

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