Non capisco perchè se ad esempio dichiaro:

codice:
String s="ciao";
System.out.println(s);
Il compilatore javac non mi segnala alcun errore e non avviene alcuna eccezione a runtime.
Ma s è solo un riferimento di tipo String, non c'è alcun oggetto istanziato, dovrei fare:

codice:
String s=new String("ciao");
System.out.println(s);
Eppure funziona anche se s non è il riferimento a un oggetto istanziato.
Non capisco il perchè, mi spiegate?