java 引用

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
 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章