public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
Operator(a,b);
System.out.println(a+" "+b);
}
public static void Operator(StringBuffer x,StringBuffer y){
x.append(y);
y=x;
}
輸出AB B
原因:(建議自己動手畫圖有利於理解)
1》StringBuffer a = new StringBuffer("A");StringBuffer b = new StringBuffer("B");執行到這兩句,jvm在棧裏面分配了兩塊內存給引用a,b.在堆裏面分配了兩塊內存給A,B,這裏假設AB在堆裏面的地址分別是#1,#2,,顯然棧裏面分配的兩塊內存裏面存放的就是地址#1,#2
2》 Operator(a,b);執行到這兒,轉到 public static void Operator(StringBuffer x,StringBuffer y){
x.append(y);
y=x;
}
此時jvm會在棧裏面再分配兩塊內存給引用形參x,y.假設存放的分別是地址#3,#4,接下來進行引用傳遞,將a,b傳遞給x,y。此時xy裏面存放的分別是a,b存放的地址#1,#2, 執行到x.append(y);時,#1地址中原本的A變爲了AB,執行到 y=x時,y中存放的地址變爲了x中存放的地址#1,
此時,調用函數代碼執行完畢,局部變量空間釋放,也是釋放xy
這個時候,ab中存放的地址還是#1,#2,只是地址#1中存放不再是A,而是AB.#2中存放的依然是B