String literals are a little tricky. The compiler is smart enough to resolve "ja" + "va" into "java", which it knows is the same as what the variable java is set to. So, it sets the references to point to the same spot in the string pool.
but it is NOT smart enough to know that "ja" + va, where va is a variable that can change, resolves to "ja" + "va", etc.
So, that will not be resolved until runtime, thus pointing to a different place.
There are only two hard things in computer science: cache invalidation, naming things, and off-by-one errors