Worked example
static void bump(int n) { n = n + 100; } // original unchanged
static void rename(Dog d) { d.name = "changed"; } // field DOES change
static void replace(Dog d) { d = new Dog("new"); } // caller sees nothing
Compare the last two. rename reaches through the reference and edits the object — visible outside. replace points the local copy at a different object — the caller's variable still points at the old one.
Rule of thumb: a method can change what the object contains, but cannot change which object the caller's variable points at.