A variable is a reference to an object; it's not the object itself. If you assign a variable to point to a new object, then any old object it pointed to is still there, and any other variables that pointed to it still point to it. So in "first" you pass a reference to a Value object to the method "second". "second" sets the member "i" of that Value object to 20, then makes the reference point to another Value object and manipulates this different object. "first" still holds a reference to the original Value, the one with 20 in its "i" member. See the JavaRanch "Campfire Stories" for more information; in particular, take a few minutes to read this one.