En fait ce qui se passe quand tu ecris String maChaine, c qu'il prend le constructeur par défaut(sans parametres), ce qui fait que s'il n'y a pas de constructeur declare sans parametres, il prend un costructeur sans parametres de sa super classe et ainsi de suite.
Lorsque tu ecris String maChaine = new String(), s'il n'y pas de constructeur sans parametre il fait pareil, sinon il appelle ce constructeur où il peut y avoir des affectations(valeurs par defaut), ce qui ne peut etre fait de facon aussi specifique dans un constructeur de super classe.
Je sais c un peu lourd comme explication, mais bon j'espere que ca t'aide tt de meme surtt pour comprendre l'heritage et l'appel de methodes en fin de compte.