复习一下java的参数传递

本文通过一个简单的Java交换方法示例,详细解释了Java中的参数传递机制,并探讨了如何实现类似C++中的swap方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为别人问了一个快速排序问题,所以复习了下算法,手头的算法书是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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值