quando scrivi

codice:
Object o;
avverti il compilatore che esisterà un oggetto di nome o di tipo Object

quando scriverai

codice:
o = new Object();
esisterà davvero e la memoria sarà allocata

La classe String è specificata come final, quindi non può essere estesa e gli oggetti String non possono essere modificati, esempio:

codice:
String a = "ciao";
String b = a.substring(0, 2); // ritorna una stringa nuova senza modificare a, quindi viene allocato un oggetto nuovo

String c = "java";
c = "sun"; // c viene ricostruito, non modificato