in a nutshell, There are two components at play. The String's real (excuse the word) identity, which I will refer to as String-Soul, and the the variable that we have assigned to the string.
So, newstring = "abc"; The String-Soul "abc" is created and the variable newstring reflects that.
When I then set newstring = "def"; the String-Soul "def" is created and the variable newstring is now a reflection of "def"; while the String-Soul "abc" hangs out.
side note: the place Strings hang out is called the String Pool.