2015-03-28 4 views
8

Qual è la connessione tra System.out.println() e toString() in Java? per esempio:La connessione tra "System.out.println()" e "toString()" in Java

public class A { 
    String x = "abc"; 

    public String toString() { 
     return x; 
    } 
} 

public class ADemo { 
    public static void main(String[] args) { 
     A obj = new A(); 
     System.out.println(obj); 
    } 
} 

Se la classe principale corre, dà un'uscita come "abc". Quando rimuovo il codice che sovrascrive lo toString(), restituisce un'uscita come "[email protected]". Quindi, qualcuno può spiegare qual è il principio di funzionamento di System.out.println() quando utilizzo il parametro come oggetto? È completamente connesso al metodo toString()?

+0

abcd efgh. abcd. –

risposta

11

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".

3

toString() è un metodo presente nella classe Object (Root dell'albero di ereditarietà) per tutte le classi.

System.out.print() (SOP) chiamerà il metodo toString quando viene alimentato un oggetto.

Se non sovrascrivere il metodo toString(), SOP chiamerà il genitore toString() che, se genitore è la classe Object, verrà stampata la hashCode dell'oggetto

Se si sovrascrive il metodo, SOP chiamerà il metodo di toString()

0

System.out.println (obj) stamperà la stringa restituita da obj.toString() se non ignorare che chiamerà il metodo di base Object.toString() che di default il metodo toString per la classe Object restituisce una stringa composta dal nome della classe di cui l'oggetto è un'istanza, il carattere at-sign `@ 'e la rappresentazione esadecimale senza segno o f il codice hash dell'oggetto. In altre parole, questo metodo restituisce una stringa uguale al valore di:

getClass().getName() + '@' + Integer.toHexString(hashCode())