CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

同样是交换两数的问题

楼主Idideads()2006-10-13 01:46:25 在 Java / J2SE / 基础类 提问

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

相关问题

关键词

得分解答快速导航

  • 帖主:Idideads

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo