如何用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; }
此篇文章已被阅读2330 次