In case of apending text, you are operating on original reference to the object which is "one" that'y its being reflected in the main method.
I hope following description will help to understand things better.
In Main Method
a => "one"
b => "two"
Here variable a and b are local to main method which contains reference to two objects "one" and "two" respectively.
swap method call: swap(a , b)
through this method call, only reference to the two objects "one" and "two" is passed, not variables.
In Swap Method
public static void swap(StringBuffere a, StringBuffere b)
The above line of code, creates its own variables a and b (which are now local to the Swap method and has nothing to do with the ones in main method) and holds the "reference" to two objects "one" and "two" respectively created in the main method.
a.append("more");
As variable a contains reference of exactly that object which was created in main method, that's why it will be updated now to "onemore" and as variable a in main method also points to this object that's why this change will be reflected there in main method.
b = a;
When the above line of code will be executed, it will assign reference in variable a (to "onemore" object) to variable b. Now variable b also points to the object "onemore". But this assignment is local to this method because we decided already that variables a and b in swap method are local to only this method, that's why this reference assignment will not reflected in the main method.
Hope this will help....
Asif