I used to think that I figured out this question. I found a post today and a little progress! Public class teststringbuff {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;}} The value of Print comes from AB, and A puts up what I understand, I don't know if it is right. Operate (a, b); At this time, the reference value of the time object is transmitted ,? ? ? In X.Append (Y), the object is "ab", which changed, turned into a reference value of "ab" object and y = x; the copy of the currently referenced, the B object did not change, It only changed its reference value, and the object B saved in the method main did not change, so System.out.Println (A "," B); coming out is AB, A