La conexión entre ‘System.out.println ()’ y ‘toString ()’ en Java

¿Cuál es la conexión entre System.out.println() y toString() en Java? p.ej:

 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); } } 

Si la clase principal se ejecuta, da una salida como "abc" . Cuando elimino el código que anula toString() , da una salida como "A@659e0bfd" . Entonces, ¿alguien puede explicar cuál es el principio de funcionamiento de System.out.println() cuando uso el parámetro como un objeto? ¿Está completamente conectado con el método toString() ?

System.out es un PrintStream . Printstream define varias versiones de la función println() para manejar números, cadenas, etc. Cuando llama a PrintStream.println() con un objeto arbitrario como parámetro, obtiene la versión de la función que actúa sobre un Object . Esta versión de la función

… llama al principio String.valueOf (x) para obtener el valor de cadena del objeto impreso …

Mirando String.valueOf(Object) , vemos que regresa

si el argumento es nulo, entonces una cadena igual a “nulo”; de lo contrario, se devuelve el valor de obj.toString ().

Entonces, para abreviar, System.out.println(someObject) llama a la función toString() ese objeto para convertir el objeto a una representación de cadena.

Si su objeto define su propia función toString() , entonces eso es lo que se llamará. Si no proporciona dicha función, su objeto heredará toString() de una de sus clases principales. En el peor de los casos, heredará Object.toString() . Esa versión de toString () se define para devolver

una cadena que consiste en el nombre de la clase de la cual el objeto es una instancia, el caracter en el signo ‘@’ y la representación hexadecimal sin signo del código hash del objeto.

O, en otras palabras:

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

Por lo tanto, cuando llama a System.out.println() en un objeto que no define su propia versión de toString (), puede obtener la versión del Object que se parece a “classname @ someHexNumber”.

toString() es un método que existe en la clase Object (raíz del árbol de herencia) para todas las clases.

System.out.print() (SOP) llamará al método toString cuando se alimenta un objeto.

Si no sobrescribe el método toString() , SOP llamará a parent toString() que, si parent es la clase Object, imprimirá el hashCode del objeto

Si sobrescribe el método, SOP llamará a su método toString()

System.out.println (obj) imprimirá la cadena devuelta de obj.toString () si no lo sobrescribe, invocará el método base object.toString () que de forma predeterminada el método toString para la clase Object devuelve una cadena que consiste en nombre de la clase cuyo objeto es una instancia, el carácter al firmar `@ ‘, y la representación hexadecimal sin signo del código hash del objeto. En otras palabras, este método devuelve una cadena igual al valor de:

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