解决两个问题:(说明运行结果的原因)
1:public class Foo {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b= new StringBuffer("B");
operate(a,b);
System.out.println(a+","+b);
}
static void operate(StringBuffer x ,StringBuffer y){
x.append(y);
y = x;
}
}2:public class Test1 { public static void add(Integer i){
int val = i.intValue();
val +=3;
i = new Integer(val);

}
public static void main(String[] args) {
Integer i = new Integer(0);
add(i);
System.out.println(i.intValue()); }}

解决方案 »

  1.   

    第二个问题和第一个问题同解。
    第一个问题:生成了a,b两个StringBuffer对象,然后传入operate方法中,在这个方法中传过来的是引用,也就是x指向a,y指向b,然后x.append(y)操作把a连接上b,y=x操作只是改变了y的引用,也就是让他指向a,并没有改变b对象。
      

  2.   

    Thinking in java 中有写到:在许多编程语言中,方法似乎要在它的作用域内复制其参数的一个副本
    这就是问题的关键!问题1: AB,B
    参数是对象 ,副本和母本的值相同,指向了同一个对象,所以对副本指向的对象的操作会改变母本指向的对象的属性,所以x.append(y)会改变副本所指的对象的属性,而y=x只是修改副本的值,实参所指的对象的属性没有变化问题2: 0
    i= new Integer(val); 关键也在此,理由同上