No objects are created by the compiler. No objects live in the constant pool. All objects are created at runtime and inhabit the heap. String objects that are interned happen to be referenced from the String pool. The String pool is not the constant pool of a class.
The String object pointed to by a string literal is created the first time such literal is used, and interned. Subsequent string literals with the same content are pointing to such String object. It is like magic !

[ September 15, 2003: Message edited by: Jose Botella ]