Il metodo toString()
, ereditato dalla classe Object
, in pratica può essere usato per convertire un oggetto in stringa.
Il metodo toString()
viene richiamato automaticamente su un oggetto, cioè la conversione da oggetto a stringa viene fatta implicitamente, quando:
-
si stampa lo stato dell’oggetto con il metodo
print()
oprintln()
della classePrintStream
; -
si concatena l’oggetto con una stringa (anche vuota) con l’operatore
+
o+=
.
System.out.println(oggetto)
stampa
oggetto.toString()
stringa + oggetto
equivale a
stringa + oggetto.toString()
Se la variabile oggetto contiene un riferimento nullo la conversione in String
restituisce la stringa null
.
Non si ottiene la conversione implicita invece assegnando un oggetto a una variabile o a un parametro di tipo String
o concatenando due oggetti con l’operatore +
, quindi queste operazioni non sono permesse.
Non esiste un metodo predefinito per convertire una stringa in oggetto; è possibile definire un costruttore della classe che riceve un parametro String
per definire lo stato iniziale dell’oggetto o definire un metodo apposito.
Il metodo toString()
che viene ereditato dalla classe Object
, come rappresentazione stringa dell’oggetto, dà il nome della classe a cui appartiene l’oggetto seguito dall’indirizzo dell’oggetto in memoria.
Conviene ridefinire il metodo in modo da restituire una stringa più appropriata.
Per esempio la classe predefinita Rectangle
del package java.awt
ridefinisce toString()
in modo da stampare il nome della classe e tra parentesi quadre l’elenco degli attributi dell’oggetto con i loro valori.
Rectangle rett = new Rectangle(10,50,150,200); String s = rett.toString();
imposta s
a
java.awt.Rectangle[x=10,y=50,width=150,height=200]
Nelle classi Persona
e Studente
Invece del metodo stampaDati()
si potrebbe usare il metodo toString()
.
Nella la classe Persona
:
public String toString() { String s = "nome=" + nome + "; "; s = s + "datanascita=" + datanascita + "; "; s = s + "indirizzo=" + indirizzo + "; "; return s; }
Nella classe Studente
:
public String toString() { String s = super.toString(); s = s + "scuola=" + scuola + "; "; s = s + "classe=" + classe + "; "; return s; }
In tal caso per stampare i dati di un oggetto della classe Persona
o Studente
basta fare:
System.out.println(persona); System.out.println(studente);
Diagramma UML delle classi dell’esempio
Anche i metodi stampaDati()
della gerarchia degli animali potrebbero essere più correttamente sostituiti con metodi toString()
.
Nella classe Animale
:
public String toString() { String s = "regno: " + regno + "; "; s = s + " classe: " + classe + "; "; s = s + " specie: " + specie + "; "; return s; }
Nella classe Cane
:
public String toString() { String s = super.toString(); s = s + " razza: " + razza + ";"; return s; }
Si può quindi fare:
Cane cane = new Cane("cocker"); System.out.println(cane);
Diagramma UML delle classi dell’esempio