import java.io.Serializable;public class A implements Cloneable, Serializable{
public int number;
protected Object clone() throws CloneNotSupportedException{
return super.clone();
}
}
public class TempTest { private void test1(A a) {
a.number = 5;
System.out.print(" " + a.number);
} private void swap(A a, A b) {
A temp = a;
a = b;
b = temp;
System.out.println(" " + a.number);
System.out.println(" " + b.number);
} public static void main(String[] args) throws Exception {
TempTest test = new TempTest();
A a = new A();
a.number = 3;
A b = new A();
b.number = 4;
test.swap(a, b);
System.out.println(" " + a.number);
System.out.println(" " + b.number);
test.test1(a);
System.out.println(" " + a.number);
A c = (A) a.clone();
test.test1(c);
System.out.println(" " + a.number);
}
}
结果输出: 4
 3
 3
 4
 5 5
 5 5
高手指点一下是怎么算出来的?

解决方案 »

  1.   

    没有计算啊,就是一些正常的赋值、改变值,唯一区别的就是最后一个 A c = (A) a.clone();它是克隆了一个跟a一模一样的堆区域,但这时是两个区域了,不像之前都是在一个区域上操作。
      

  2.   


    test.swap(a, b);的时候重新创建对象,不影响现有对象,所以输出
    43 34test.test1(a); 的时候也是重新创建对象,只是test1()里面重新赋值了输出 
    5
    但是刚刚test.swap(a, b);的时候也是重新创建的对象,没有影响下面的值,现在却会
    输出  5 而不是 3   ?
      

  3.   

    "但是刚刚test.swap(a, b);的时候也是重新创建的对象,没有影响下面的值,现在却会
    输出  5 而不是 3   ?"
    哈哈,swap方法里面其实只是改变了栈变量的引用而已,并没有改变堆里面的对象的值。swap参数里的a变量和main方法里的a变量他们在栈里面是两个不同的变量,只不过它们都同时指向同一个堆对象。(当然在执行了你的swap方法后,swap方法里的a变量指向了b变量原来指向的堆对象)。
    test1(a)方法里直接改变了a变量指向的堆对象的值,所以main方法和test1方法都输出5(因为他们指向同一个堆对象)