一.题目:
public class MyClass {
static void aMethod(StringBuffer sf1, StringBuffer sf2) {sf1.append(sf2);
sf2 = sf1;
}
public static void main(String[] args){
StringBuffer sf1 = new StringBuffer("A");
StringBuffer sf2 = new StringBuffer("B");
aMethod(sf1,sf2);
System.out .println(sf1+ ":"+sf2);
}
}
问输出的结果是:AB:B
二.知识点:
1.StringBuffer可以更安全的(线程安全的)改变字符串内容(有别于String期间不需要创建新的对象);
2.Java内存管理中对象的引用关系;
三.此题的运行过程:
1.从main方法进入,在堆中创建对象“A”,“B”,sf1与sf2分别指向他们,图中的①②步骤
2.执行aMethod(sf1,sf2)方法:
方法中局部变量sf1,sf2也指向“A”和“B”,追加sf1.append(sf2);将sf2追加至“A”后变为“AB”,此过程直接对字符串操作。赋值sf2 = sf1;将sf2引用执行sf1所指的对象,弃用原引用。图中的③④⑤⑥步骤:
3.aMethod(sf1,sf2)执行完毕回到main方法:
aMethod(sf1,sf2)执行完后销毁方法中的形参局部变量,此时③④步骤的引用也已经失去了,
System.out .println(sf1+ ":"+sf2);中的引用对象此时为AB和B。