Grunden til at du ikke direkte behøver at lave et objekt af String før du skal bruge den, er at en string er en sekvens af chars (CharSequence), og en char er en primitiv datatype.
Det er nu ikke helt korrekt. En string instans ér et objekt, men er så ofte brugt klasse, at man i Java sproget har valgt at lade programmøren definere dem som object literals. Strenge er altså noget, som håndteres specielt i sproget.
Derfor opretter man også et objekt, med alt hvad dertil hører, når man skriver:
String str = "Hello, World!";
Siden ovenstående streng er en konstant ligger den i Java klassens constant pool (som er en del af klassefilen), men der oprettes stadig et objekt.
Det har man valgt at gøre, for at spare plads og for at gøre det nemmere for programmøren som ligeså godt kunne have gjort noget i stil med:
String str = new String(new char[] {'H','e','l','l','o',',',' ','W','o','r','l','d','!'});
Jeg siger bare "tak" for genvejen :-)