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);
}
}
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);
}
}
X:0,Y:0
X:0,Y:0
X:100,Y:100
X:0,Y:0
arg1.x = 100; //把p1点的横坐标置成100
arg1.y = 100; //把p1点的纵坐标置成100
//结合你的代码,上面两句代码的作用就是将一个坐标(100,100)点和一个(0,0)的点交换
Point temp = arg1;
arg1 = arg2;
arg2 = temp; //这三句估计是你觉得有问题的地方,你只要记住了java中是不存在引用传递的,但其实你的这个方法一执行完,p1和p2之前什么样 之后还是什么样子。所以上面的坐标赋值是保存下来了 但是这里的引用却没有返回去。
}
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;
X:0Y:0
X:0Y:0
X:100Y:100
X:0Y:0
对不对
我的解释
一开始设置p1对应的对象的属性,然后是arg1和arg2对应的地址值改变,而p1 p2对应的对象地址不变所以还是原来的p1 p2
P1 和 P2的引用地址并没有改变,改变的指是方法中的arg1 arg2 temp ,是它们在相互指向P1和P2的引用;其次就是P1 P2的X Y 改变了(arg1指向P1的引用时改变的)。
在方法被调用完后,arg1 和arg2 以及temp会在栈内存中消失故最后结果就是那样了。
这句话:“是P1 P2的X Y 改变了(arg1指向P1的引用时改变的)”,没有P2。
不好意思。