La classe Object (e quindi tutte le classi che da essa derivano) offre un metodo public String toString() che restituisce una stringa; tale stringa dovrebbe essere una rappresentazione dell'oggetto. Se non ridefinisci tale metodo, esso ritorna il valore del metodo predefinito. Redefinendolo puoi decidere che tipo di stringa deve essere associata ad un oggetto. L'istruzione return... è corretta perchè restituisce una stringa.


Quanto alla seconda domanda, il secondo costruttore non va bene perchè in entrambi i casi i parametri formali del costruttore hanno lo stesso nome degli attributi titolo e autore della classe; questo significa che i parametri formali oscurano i membri della classe, e scrivendo 'titolo' stai facendo riferimento al parametro; con this fai riferimento ai campi dell'oggetto