It’s the other way around. There are two references to a single spaceship object’s adress. Our original reference is stored in the variable ‘spaceship’. Object variables such as ‘spaceship’ hold the reference (address) to an object rather than the value itself (unlike a primitive data type variable such as an int which hold the actual value).
When we call a function with a spaceship parameter, we pass the reference stored in our ‘spaceship’ variable to the function. We still have our original ‘spaceship’ variable, and the function receives a copy of the reference to the spaceship object (let’s call it ‘spaceshipIn’). The function can re-assign ‘spaceshipIn’ to a new object but it won’t affect our ‘spaceship’ variable, which continues to reference the original object. However, when the function is called, ‘spaceship’ and ‘spaceshipIn’ refer to the same object, so if we use ‘spaceshipIn’ to change vaues in that object, those changes will persist after the function has returned, where we can see them, using the variable ‘spaceship’ to access the object.