复习一下java的参数传递

因为别人问了一个快速排序问题,所以复习了下算法,手头的算法书是C++的,所以自己改成java代码。

这个快速排序算法用到了c++的swap()方法,java里面没有这种方法,估计是因为太方便了不规范,所以API里没有提供。囧

自己实现的时候顺便复习了一下java的参数传递。

  1. public class Test{

  2.     public static void main(String[] args){
  3.     int a=5;
  4.     int b=10;
  5.     alter(a,b);
  6.     System.out.println("a="+a);
  7.     System.out.println("b="+b);
  8.     }

  9.     public static void alter(int a,int b){
  10.     int temp=b;
  11.     b=a;
  12.     a=temp;
  13.     System.out.println("inside_a="+a);
  14.     System.out.println("inside_b="+b);
  15.     }

  16. }
结果:
  1. inside_a=10
  2. inside_b=5
  3. a=5
  4. b=10
从显示结果可以看出,alter方法内形参(parameter)的改变并不影响方法外的实参 (argument)。貌似这和c一样……囧……

当我们把例子中的int全部改为Integer封装类时,结果一样。所以可以证实java果然是传说中的值传递(pass by value)……就是说只是传个相同的值过去,怎么变这个值都和原来的没关系……囧……值传递相反的是引用传递(pass by reference)

那么怎么实现这个swap()方法呢,首先复习一下java的传递过程:

参数传递有两种情况,传递基本数据类型和传递对象(object),基本数据类型就是int,long等定义的数据,对象就是Interger,Long和用户自定义的类对象。

基本数据类型是储存在栈(stack)中。而对象的创建,如Integer test=new Integer();,则会先执行new Integer()(先执行赋值运算符右边的表达式),在堆(heap)中创建规定大小的Integer对象空间,此时这个空间为空(null)。然后执行Integer test,在栈中创建一个只能指向Integer类的、名为test的引用(reference)。然后将这个引用指向刚才定义的Integer空间。

而在参数传递时,基本数据类型和对象传递都是将栈中的内容,作为实参复制一份作为形参,所以无论怎么改变形参,都只是改编基本数据类型和对象在栈中引用的拷贝而已,不会影响到实参。

如果要实现这个Swap()方法,基于OOP思想,则创建一个Swap对象,接受参数之后,存储在对象内部,用内部方法交换数据,再把参数传回请求。

  1. class Swap{
  2.     private int x;
  3.     private int y;
  4.     public Swap(int x,int y){
  5.     this.x=x;
  6.     this.y=y;
  7.     }
  8.     
  9.     public void doSwap(){
  10.     int temp=x;
  11.     x=y;
  12.     y=temp;
  13.     }
  14.     public int getx(){return x;}
  15.     public int gety(){return y;}
  16. }

  17. public class Test{
  18.     public static void main(String[] args){
  19.     int x=5;
  20.     int y=10;
  21.     System.out.println("x="+x);
  22.     System.out.println("y="+y);
  23.     Swap temp=new Swap(x,y);
  24.     temp.doSwap();
  25.     x=temp.getx();
  26.     y=temp.gety();
  27.     System.out.println("after swap x="+x);
  28.     System.out.println("after swap y="+y);
  29.     }
结果:
  1. x=5
  2. y=10
  3. after swap x=10
  4. after swap y=5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值