同样是交换两数的问题
public class test
{
public void Exchange(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
public static void main(String agrs[])
{
test ob = new test();
int m = 44, n = 77;
System.out.println("before exchange: m = " + m + ", n = " + n);
ob.Exchange(m, n);
System.out.println("after exchange: m = " + m + ", n = " + n);
}
};
以上程序输出:
before exchange: m = 44, n = 77
after exchange: m = 44, n = 77
可以看出m、n的值并没有交换,请问怎样修改Exchange()函数才能让m、n的值交换?
问题点数:20、回复次数:40Top
1 楼pingshui()回复于 2006-10-13 03:28:05 得分 0
听说不能引用的,只能用返回值!
请高手再指点!Top
2 楼terry6394(小猪,向前跑!)回复于 2006-10-13 05:18:08 得分 0
没有什么办法。
只能把那交换的过程放在main()里。
Top
3 楼omgsunny(家人健康)回复于 2006-10-13 08:46:59 得分 0
放到object中 java对于基本数值型不能传递地址Top
4 楼omgsunny(家人健康)回复于 2006-10-13 08:56:45 得分 0
object好像也不行,不知道怎么捣鼓了Top
5 楼haisenmai(我应该做得到)回复于 2006-10-13 09:05:28 得分 0
package csdn;
public class test
{
public int[] Exchange(int a, int b)
{
int [] rest = new int[2];
int temp;
temp = a;
a = b;
b = temp;
rest[0]=a;
rest[1]=b;
return rest;
}
public static void main(String agrs[])
{
test ob = new test();
int m = 44, n = 77;
System.out.println("before exchange: m = " + m + ", n = " + n);
int [] rest = new int[2];
rest = ob.Exchange(m, n);
System.out.println("after exchange: m = " + rest[0] + ", n = " + rest[1]);
}
};
Top
6 楼learner_007(世人笑我太疯癫,我笑世人看不穿。)回复于 2006-10-13 09:29:42 得分 0
把它放到main()中
是可以的!Top
7 楼twjava(水手)回复于 2006-10-13 09:45:31 得分 0
public class ExchangeNumber {
private int m = 44,n=77;
public static void main(String[] args) {
ExchangeNumber en = new ExchangeNumber();
System.out.println(en.m+" "+en.n);
en.exchange(en);
System.out.println(en.m+" "+en.n);
}
public void exchange(ExchangeNumber en){
int temp = en.m;
en.m = en.n;
en.n = temp;
}
}Top
8 楼jihanzhong(逍遥)回复于 2006-10-13 09:52:24 得分 0
用Integer就可以了Top
9 楼gray820928(珏色倾城)回复于 2006-10-13 10:16:57 得分 0
main里面没有接收ob.Exchange(m, n);的返回值Top
10 楼agui(阿贵: 高级图形用户界面)回复于 2006-10-13 10:30:01 得分 0
楼主不要白费劲了,不可能的。除非你始终操作数组元素。比如:
// 交换元素
void exchange( int []a, int i, int j ) {int tmp = a[i]; a[i] = a[j]; a[j] = tmp;}
// 交换前两个
void exchange( int []a ) {exchange( a, 0, 1 );}
int[]ii = {1,2};
exchange( a );
把 ii[0], ii[1] 当成是a, b来操作,比如计算 c=a+b:
int c = ii[0] + ii[1];
int d = ii[0] * ii[1];
--
http://www.agui.googlepages.com
mailto: agui.cn(a)gmail.comTop
11 楼agui(阿贵: 高级图形用户界面)回复于 2006-10-13 10:30:56 得分 0
sorry笔误:
int[]ii = {1,2};
exchange( a );
应该为
int[]ii = {1,2};
exchange( ii );
--
http://www.agui.googlepages.com
mailto: agui.cn(a)gmail.comTop
12 楼Idideads()回复于 2006-10-13 12:32:04 得分 0
java中的引用包括数组和对象,看来只能用数组或对象来实现了.
Top
13 楼sydongda(越飞越高)回复于 2006-10-13 16:55:22 得分 0
public class Test {
public static void main(String[] args) {
int i = 10, j = 44;
class Exchange {
void exchange() {
int t = i;
i = j;
j = t;
}
}
new Exchange().exchange();
}
}Top
14 楼oracs(有技术没约束)回复于 2006-10-13 17:36:32 得分 0
这应该是参数传递的问题,是by value,还是by reference
传入的是object应该就没问题了
Top
15 楼changzhang(爪哇猫)回复于 2006-10-13 17:42:55 得分 0
没有必要完成这个功能吧,没什么用的。
不要在这些地方下功夫了。Top
16 楼brier_wu()回复于 2006-10-13 18:04:14 得分 0
对象 和变量,一个是引用传递 一个是值传递,好象就这点吧Top
17 楼88324877(寂寞呆头鱼)回复于 2006-10-13 18:06:30 得分 0
基本数据(如 Int,float,boolean等)变量多实参传递给被调用的方法采用是值的方法传递。
只有String类型,数组类型和对象类型才会以地址的方法传递。
Top
18 楼liufh44()回复于 2006-10-13 18:33:42 得分 0
我是这样实现的,但还有一个问题,如果要进行三个以上数值交换该怎么办?
public class test2
{
int a;
int b;
public static void main(String agrs[])
{
test2 ob = new test2();
ob.a = 44;
ob.b = 77;
System.out.println("before exchange: m = " + ob.a + ", n = " + ob.b);
System.out.println("after exchange: m = " + ob.b + ", n = " + ob.a);
}
};
Top
19 楼iambic()回复于 2006-10-13 18:45:36 得分 0
写成一个类喽。
class AB
{
private int a;
private int b;
pubilc int getA();
public int getB();
public void setA();
public void setB();
public void exchange() {
int temp = a;
a = b;
b = temp;
}
}Top
20 楼agui(阿贵: 高级图形用户界面)回复于 2006-10-13 18:56:51 得分 0
“三个以上数值交换”,其它语言怎么交换? A->B->C->A?
--
http://www.agui.googlepages.com
mailto: agui.cn(a)gmail.comTop
21 楼weinickli(总有路,总没走)回复于 2006-10-13 20:33:40 得分 0
public void Exchange(Integer a, Integer b)就可以了Top
22 楼bruni(不如你)回复于 2006-10-13 20:49:33 得分 0
汗!!!
既然知道了传值和传引用的区别,为什么不能从引用的角度考虑!
public class Test {
public Test() {}
public static void main(String[] args) {
int[] ints = new int[] { 1, 2, 3};
printIntArray(ints);
ints = test(ints);
printIntArray(ints);
}
public static int[] test(int[] args) {
int length = args.length;
int[] newargs = new int[length];
for (int i = 0; i < length; i++) {
newargs[length - 1 - i] = args[i];
}
return newargs;
}
public static void printIntArray(int[] args) {
int length = args.length;
System.out.println("Print int array:");
for (int i = 0; i < length; i++) {
System.out.println(args[i]);
}
}
}Top
23 楼Idideads()回复于 2006-10-13 21:58:05 得分 0
在java 1.4以前的版本,通过new操作符,可以用一个简单对象构造出一个位于堆上的复杂对象,而且每一个简单对象的背后,都有一个复杂对象的类提供折支持。它们是:Byte, Character, Short, Integer, Long, Double, Float和Boolean,这些对象能提供更高一级的数据操作能力,而且由于它们也是从Object类派生下来的,所以它们可以同Object之间进行转化,从而利用java的对象识别能力进行复杂应用。将一个简单对象置于堆上的操作,微软称其为“装箱”(Box)。Top
24 楼agui(阿贵: 高级图形用户界面)回复于 2006-10-13 22:43:01 得分 0
Byte, Character, Short, Integer, Long, Double, Float和Boolean 都是值对象,就是说它本身是多少就是多少,没有办法改变。
--
http://www.agui.googlepages.com
mailto: agui.cn(a)gmail.comTop
25 楼hackangcn(龙卷风)回复于 2006-10-13 23:35:31 得分 0
两个数值交换用一个表达式不就ok了
a=b+(b=a)*0Top
26 楼zhang2415(岸上的青蛙)回复于 2006-10-13 23:41:44 得分 0
public class Test {
private int a;
private int b;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
/**
* @param args
*/
public void Exchange(int a, int b){
int temp;
this.a = a;
this.b = b;
temp = this.a;
this.a = this.b;
this.b = temp;
}
public static void main(String[] args) {
Test ob = new Test();
int m = 44, n = 77;
System.out.println("before exchange: m = " + m + ", n = " + n);
ob.Exchange(m, n);
System.out.println("after exchange: m = " + ob.getA() + ", n = " + ob.getB());
}
}Top
27 楼zhang2415(岸上的青蛙)回复于 2006-10-13 23:44:51 得分 0
要使用面向对象的思想,其实处理方法也很多,但不一定要用数组。你的方法是写c的人喜欢的方法,但要是真的用c写,应该用到指针,而java是没有指针的概念的。Top
28 楼ntipossible()回复于 2006-10-14 16:37:10 得分 0
同意liufu44,3个数跟两个数没什么区别吧Top
29 楼qsrock()回复于 2006-10-14 19:05:41 得分 0
int a,b;
a=a+b;
b=a-b;
a=a-b;
这样不是可以简单的交换两个数了!Top
30 楼rainbow_ayst(口丁拉瓦)回复于 2006-10-14 19:18:34 得分 0
搂主 告诉你为什么 比给你代码要好
java有两大数据类型 一种是8大基本类型 一种是引用类型(除了基本类型其他基本都可看作引用类型)
引用类型的对象 作为参数 即传值又传引用 那样的话你是可以Exchange()那样操作的
不幸的是int 类型是基本类型 作为参数的时候 只传值
所以会出现你那种情况
Top
31 楼MySoftZone()回复于 2006-10-14 19:44:32 得分 0
java 只支持值传递,除非用封装类Top
32 楼yuppiegz(于小鱼)回复于 2006-10-14 21:27:39 得分 0
public class Mugs
{
int m ,n;
public void Exchange(int a, int b)
{
m=b;
n=a;
}
public static void main(String agrs[])
{
Mugs ob = new Mugs();
int m = 44;
int n = 77;
System.out.println("before exchange: m = " + m + ", n = " + n);
ob.Exchange(m, n);
System.out.println("after exchange: m = " + ob.m + ", n = " + ob.n);
}
};
以上代码运行通过,且结果正确~~~~
楼主原代码里虽然ob.Exchange(m, n)了,但打印时还是用System.out.println("after exchange: m = " + m + ", n = " + n);这样打印出来的其实还是你是main()里定义的int m = 44, n = 77;
Top
33 楼johnhan2006(边城浪子)回复于 2006-10-14 22:29:25 得分 0
其实看值是否交换了,那就看参数传递的形式是by reference 还是 by valueTop
34 楼xwt630()回复于 2006-10-15 15:16:58 得分 0
这是值传递,要引用传递,Top
35 楼kite0536()回复于 2006-10-15 15:43:42 得分 0
这个问题也不是很麻烦的 参数传递不行。因为接受参数的子程序参数的改变不会影响到该方法以外。但是可以传递一个对象。
class Test{
int a,b;
Test(int i,int j){
a=i;
b=j;
}
}
void meth(Test o){
int t;
t=o.a;
o.a=o.b;
o.b=t;
}
public static void main(String agrs[])
{
Test ob = new Test(44,77);
System.out.println("before exchange: a = " + ob.a + ", b = " + ob.b);
ob.meth(ob);
System.out.println("after exchange: a = " + ob.a+ ", b = " + ob.b);
}
}
Top
36 楼rypgood(失魂)回复于 2006-10-15 16:56:41 得分 0
public void Exchange(int a, int b)
里面的参数去掉就ok了。Top
37 楼rypgood(失魂)回复于 2006-10-15 16:58:58 得分 0
好象又不行啊
郁闷Top
38 楼rypgood(失魂)回复于 2006-10-15 17:09:40 得分 0
public class test
{
public void Exchange(int[] a)
{
int temp;
temp = a[0];
a[0] = a[1];
a[1] = temp;
}
public static void main(String agrs[])
{
test ob = new test();
int[] m={44,55};
System.out.println("before exchange: m = " + m[0] + ", n = " + m[1]);
ob.Exchange(m);
System.out.println("after exchange: m = " + m[0] + ", n = " + m[1]);
}
}
终于想出来了,数组是对象哈Top
39 楼agui(阿贵: 高级图形用户界面)回复于 2006-10-16 17:58:08 得分 0
hackangcn(龙卷风) 是个鬼才!a=b+(b=a)*0;
--
http://www.agui.googlepages.com
mailto: agui.cn(a)gmail.comTop
40 楼blue_sky2008(IT->egg)回复于 2006-10-16 22:49:22 得分 0
我看这也说明了 java 的缺点,只能传值不能传引用, 不过对于学习者来说,这更好理解了。Top




