oleg ha scritto:
ma per classi cme String posso assegnare direttamente una stringa, senza chiamare il costruttore con new e passarli la stringa come parametro, stesso discorso con le classi wrapper per i tipi base (pur essendoci la possibilità di usare costruttori). Com'è possibile specificare se un oggetto di una classe possa essere inizializzato "direttamente" oppure per forza con costruttori?
Di tutto il framework standard, String è una classe molto particolare, sia perché ha un utilizzo vastissimo e anche perché viene trattata in modo speciale dal compilatore, innanzitutto per il fatto di poter definire nel sorgente dei valori "letterali" di tipo String, semplicemente mettendo il testo tra apici.
String msg = "Ciao";
Qui non c'è alcun
new esplicito, a runtime quel "Ciao" denota già il riferimento ad un oggetto String. Naturalmente String ha svariati costruttori e questi sono comunque tuttora usabili (anche se il costruttore String(String) di fatto è inutile e non necessario).
Per le classi wrapper dei primitivi, non è la stessa cosa ma da Java 5 è possibile sfruttare l'auto-boxing/unboxing. È tuttora possibile, ad oggi, usare ad esempio il costruttore di Integer:
Integer num = new Integer(123);
ma da Java 5, essendoci l'autoboxing, è possibile scrivere:
Integer num = 123;
I costruttori delle classi wrapper comunque da Java 9 sono stati tutti "deprecati", ovvero sconsigliati proprio a favore del autoboxing o dell'uso esplicito del valueOf(). In futuro questi costruttori deprecati potrebbero essere fisicamente rimossi ma non si sa quando e in quale release di Java.
Per qualunque altra classe si deve creare un oggetto invocando un costruttore (a patto che sia accessibile e in classe non astratta).