从内存上看swap

问题: 如果Java是用引用来传递的话,为什么交换函数(swap)不起作用呢?

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

原因:
(1)在main()函数当中,pnt1和pnt2仅仅是对象的引用。
(2)当向tricky()函数传递pnt1和pnt2参数时,Java仅仅向传递任何其他参数一样,通过传值来传递引用。传向函数的引用实际上是原始引用的副本。

———————————————————-

图一: 当被传递给函数之后,一个对象至少存在两个引用
这里写图片描述

图二: 只有传入函数的引用交换了,原始引用则没有
这里写图片描述
———————————————————-

总结:在内存机制上分析引用传递问题思路更清晰。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章