如何用java实现swap函数?
Posted On 2012年3月10日
c语言中很好实现, 大学c语言如今已经成为了基本必修课(包括文科学生据说也是必修课之一). c语言中实现swap交换2个int类型变量, 需要用到指针, 因为这样才能有效的改变实参内容. 那么java能否实现呢?
如果我们不用object和数组,那么无法实现(即无法实现基本数据类型的转换),但却明显提高了java语言的安全性.
那么我们来看下java的函数是如何进行参数的传递的.到底是通过引用还是通过变量内容值.
public void tricky(Point arg1, Point arg2)
{
arg1.x = 100;
arg1.y = 100;
Point temp = arg1;
arg1 = arg2;
arg2 = temp;
}
public static void main(String [] args)
{
Point pnt1 = new Point(0,0);
Point pnt2 = new Point(0,0);
System.out.println("X: " + pnt1.x + " Y: " +pnt1.y);
System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);
System.out.println(" ");
tricky(pnt1,pnt2);
System.out.println("X: " + pnt1.x + " Y:" + pnt1.y);
System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);
}
执行完毕后,我们砍下输出结果。
X: 0 Y: 0 X: 0 Y: 0 X: 100 Y: 100 X: 0 Y: 0
可以发现,swap函数中,可以把pnt1中的数据进行改变,但是将pnt1和pnt2进行交换却没有成功。这是我们困惑的主要原因。 那我们通过这几张图来看一下为什么。

original reference 就是pnt1, 则method reference 就是swap函数中的arg1。我们可以看到他们都引用得同一个对象。 下图是在进行swap和swap之后的,对象以及引用的状态图。

可以发现,只是交换了arg2和arg1引用到的对象,其实对象的值并没有发生实际改变。
那么我们如何来改造这个函数呢。
public void tricky(Point arg1, Point arg2)
{
arg1.x = 100;
arg1.y = 100;
Point temp = new Point(0,0);
temp.x = arg1.x;
temp.y = arg1.y; arg1.x = arg2.x;
arg1.y = arg2.y; arg2.x = temp.x;
arg2.y = temp.y; }
此篇文章已被阅读2433 次