Charlie, I agree with everything you said except maybe your final sentence:
When a new button is created, and replaceme points to it, it
changes the original address of the object.
The original address of the object (the button) is not being changed; rather, the address which the reference variable replaceMe is pointing to is changed to point to a new button (which has no effect on the original button object). And since you've now lost your only pointer to the original button within the replacer() method, nothing that follows in that method can possibly affect the original button.