public class Swap {
public void test(Point arg1,Point arg2){
arg1.x=100;
arg1.y=100;
Point temp=arg1;
arg1=arg2;
arg2=temp;
}
public static void main(String[] args){
Point p1=new Point(0,0);
Point p2=new Point(0,0);
System.out.println("X:"+p1.x+ "Y:"+p1.y);
System.out.println("X:"+p2.x+ "Y:"+p2.y);
System.out.println(" ");
Swap s=new Swap();
s.test(p1,p2);
System.out.println("X:"+p1.x+ "Y:"+p1.y);
System.out.println("X:"+p2.x+ "Y:"+p2.y);
}
}

解决方案 »

  1.   

    结果是
    X:0,Y:0
    X:0,Y:0
    X:100,Y:100
    X:0,Y:0
      

  2.   

    public void test(Point arg1,Point arg2){ 
       arg1.x = 100; //把p1点的横坐标置成100
       arg1.y = 100; //把p1点的纵坐标置成100
                     //结合你的代码,上面两句代码的作用就是将一个坐标(100,100)点和一个(0,0)的点交换
       Point temp = arg1; 
       arg1 = arg2; 
       arg2 = temp; //这三句估计是你觉得有问题的地方,你只要记住了java中是不存在引用传递的,但其实你的这个方法一执行完,p1和p2之前什么样 之后还是什么样子。所以上面的坐标赋值是保存下来了 但是这里的引用却没有返回去。
      

  3.   

    因为你改变的只是stack上临时引用的值。。而不是arg1 arg2的值
      

  4.   

    实际上是,方法参数传递过去的是一个原来对象引用的copy,这一点可以从第一篇文章的图看出来。如果你在方法中改变内容,因为这个copy也是指向那个对象,所以改动会生效。但是如果你对这个对象的引用进行操作,例如argObject = new SomeObject();这样的操作是无效的,因为你改变的是copy,原来的引用还是指向原来的Object。就这么简单。
      

  5.   

    Point p1=new Point(0,0); 
    Point p2=new Point(0,0);
    假设新建的对象分别为A,B,此时
    p1引用A,p2引用B在进入s.test(p1,p2);时
    将p1引用的A赋给arg1,p2引用的B赋给arg2,此时p1,arg1都引用A;p2,arg2都引用B在arg1.x=100;arg1.y=100;之后,A由(0,0)变为(100,100)下面
    Point temp=arg1; 
    arg1=arg2; 
    arg2=temp;
    都是arg1,arg2,temp引用对象的改变,不涉及A,B对象值的改变,更没有改为p1对A的引用,p2对B的引用所以最后p1.x=100,p1.y=100;p2.x=0,p2.y=0真正要swap可以这么写
    int temp=arg1.x;
    arg1.x=arg2.x;
    arg2.x=temp;
    temp=arg1.y;
    arg1.y=arg2.y;
    arg2.y=temp;
      

  6.   

    我先猜一下谜底:
    X:0Y:0
    X:0Y:0
    X:100Y:100
    X:0Y:0
    对不对
    我的解释
    一开始设置p1对应的对象的属性,然后是arg1和arg2对应的地址值改变,而p1 p2对应的对象地址不变所以还是原来的p1 p2
      

  7.   

    画内存图解一下子就出来了。
    P1 和 P2的引用地址并没有改变,改变的指是方法中的arg1 arg2 temp ,是它们在相互指向P1和P2的引用;其次就是P1 P2的X Y 改变了(arg1指向P1的引用时改变的)。
    在方法被调用完后,arg1 和arg2 以及temp会在栈内存中消失故最后结果就是那样了。
      

  8.   

    上面有说错了,不好意思
    这句话:“是P1 P2的X Y 改变了(arg1指向P1的引用时改变的)”,没有P2。  
    不好意思。