如何通过方法调用交换两个变量的值
2014-04-05 16:44
639 查看
在程序开发的过程,要交换两个变量的内容,是一种比较常见的事情。在排序算法中,就有一种就叫做“交换排序法”。在所有的排序算法,交换要排序的集合中的两个元素,几乎是必须的过程。在Java中交换两个元素的内容,如果你是程序员新手,你可能碰到意想不到的问题。 首先,来看看交换下面的程序。为了交换两个整数变量的内容,写了下面这样的一个方法实现: public void swap(int i, int j) { int t = i; i = j; j = t; } |
int x = 100;
int y = 1;
swap(x, y);
在程序执行此段代码后,你会发现,x还是100, y还是1。为什么呢?因为Java对方法参数的传递,是使用值调用(call by value)的。想想,如果我这样调用swap函数呢,swap(3, 4),这是莫名其妙的,有谁会要交换3和4这两个常数呢。
那没办法交换两个整数变量了吗?可以。把swap函数体替换掉swap函数的调用就可以了。如:
int x = 100;
int y = 1;
int t = x;
x = y;
y = t;
Java中其他的原生类型(primitive type)的情况,和int的一样。
继续讨论函数调用吧。函数调用时,参数传递的方式主要有两种:
值传递
引用传递
Java使用的是值传递。值传递是把变量的值、常数或常量传递给参数。而引用传递,是把变量的所在内存中的地址传递给参数,参数通过地址找到变量的值。很明显,引用传递不能把常数传递给参数。值传递和引用传递还有一个很大的不同:对于像int这样的小类型变量来说,值传递没副作用,而引用传递有。也就是说,在函数调用的执行过程中,不能改变传递给参数的变量的值。
但对于普通类类型参数的传递方式的理解和原生类型有点不同。对于方法method(Object o)的调用method(x), 不是把对象x复制一份传递给参数o,而是把对象x的在内存中的首地址,也就是把对象x的引用拷贝给参数o。这样就能这样实现对象的交换函数了吗?
public void swap(Object o, Object p) {
Object t = o;
o = p;
p = t;
}
答案是:No。因为像下面这样的调用:
Object x = X;
Object y = Y;
swap(x, y);
在执行完上的代码后,x指向的还是原来的X对象,y指向的还是那个Y对象。就像歌唱的那样:星星还是那个星星,月亮还是那个月亮。
难道就不能通过方法调用实现交换这个功能吗?可以。有两种办法:
1、 可以交换数组等集合里的元素
public void swap(Object[] a, int i, int j) {
Object t = a[i] ;
a[i] = a[j];
a[j] = a[i];
}
2、用反射实现
用反射实现swap函数,有点杀鸡用大炮的感觉。性能不怎么样,还容易出错。大家自己试试吧。
转载于:http://www.java3z.com/cwbwebhome/article/article2/21034.html?id=1766
相关文章推荐
- 如何通过方法调用交换两个变量的值
- java如何交换这两个变量的值方法
- Java 如何用方法交换两个变量的值
- java如何交换这两个变量的值方法介绍
- 交换两个变量的值----两种方法(1)通过中间临时变量(2)不通过中间临时变量
- 如何通过调用函数交换两个变量的值及常见误区
- 写一方法来实现两个变量的交换。在主调函数中定义两个整型变量,并初始化,调用交换方法,实现这两个变量的交换。(使用ref参数)
- java如何交换这两个变量的值方法介绍
- java如何交换这两个变量的值方法介绍
- 通过反射,如何操作私有成员变量(取/赋值),如何调用私有方法?
- 交换两个变量的值,不使用第三个变量的四种法方法
- 如何不用中间变量交换两个变量的值
- 如何通过反射调用扩展方法?
- 两个变量交换的四种方法(Java)
- 如何通过反射调用类中的<泛型>方法
- c语言:4种方法;交换两个整数的位置(包括引入第三方变量和不引入第三方变量)
- 具体的一个实例,展示如何访问实例变量和调用成员方法
- 交换两个变量方法
- 通过反射获得类中变量并赋值与调用变量方法
- 交换两个变量的值,不使用第三个变量的四种方法