System.out
è un PrintStream
. Printstream definisce diverse versioni della funzione println()
per gestire numeri, stringhe e così via. Quando chiami PrintStream.println()
con un oggetto arbitrario come parametro, ottieni the version of the function that acts on an Object
. Questa versione della funzione
... chiama in un primo momento String.valueOf (x) per ottenere valore stringa dell'oggetto stampato ...
Guardando String.valueOf(Object)
, vediamo che restituisce
se l'argomento è nullo, quindi una stringa uguale a "null"; in caso contrario, viene restituito il valore di obj.toString().
Quindi, per farla breve, System.out.println(someObject)
chiama la funzione di quell'oggetto toString()
per convertire l'oggetto in una rappresentazione di stringa.
Se il proprio oggetto definisce la propria funzione toString()
, allora è ciò che verrà chiamato. Se non si fornisce tale funzione, l'oggetto erediterà toString()
da una delle sue classi padre. Nel peggiore dei casi, erediterà Object.toString()
. Tale versione di toString() è definito per tornare
una stringa costituita dal nome della classe di cui l'oggetto è un'istanza, il carattere `a-segno @', e la rappresentazione esadecimale senza segno del cancelletto codice dell'oggetto.
O, in altre parole:
getClass().getName() + '@' + Integer.toHexString(hashCode())
Così, quando si chiama System.out.println()
su un oggetto che non definisce la propria versione di toString(), si potrebbe ottenere la versione Object
che sembra "classname @ someHexNumber".
abcd efgh. abcd. –