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()