java class overriding tostring

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



class overriding (3)

System.out.println (obj) imprimirá la cadena devuelta desde obj.toString () si no la anula, llamará al método base object.toString () que, de forma predeterminada, el método toString para la clase Object devuelve una cadena que consiste en el nombre de la clase de la que es una instancia el objeto, el carácter de signo de signo ''@'' 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())

¿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 se ejecuta la clase principal, da una salida como "abc" . Cuando elimino el código que anula toString() , "A@659e0bfd" como "A@659e0bfd" . Entonces, ¿alguien puede explicar cuál es el principio de funcionamiento de System.out.println() cuando le paso la referencia del objeto obj como argumento? ¿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 en 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 devuelve

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

Entonces, para System.out.println(someObject) , System.out.println(someObject) llama a la función toString() ese objeto para convertir el objeto en 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 () está definida para devolver

una cadena que consiste en el nombre de la clase de la cual el objeto es una instancia, el carácter de signo de 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 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 alimente un objeto.

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

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