What is the connection between System.out.println()
and toString()
in Java? e.g:
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);
}
}
If main class runs, it gives an output as "abc"
. When I remove the code which overrides toString()
, it gives an output as "A@659e0bfd"
. So, can anyone explain what is the working principle of System.out.println()
when I pass the obj
object reference as an argument to it? Is it fully connected with toString()
method?
System.out
is a PrintStream
. Printstream defines several versions of the println()
method to handle numbers, strings, and so on. When you call PrintStream.println()
with an arbitrary object as a parameter, you get the version of the method that acts on an Object
. This version of the method
...calls at first String.valueOf(x) to get the printed object's string value...
Looking at String.valueOf(Object)
, we see that it returns
if the argument is null, then a string equal to "null"; otherwise, the value of obj.toString() is returned.
So, long story short, System.out.println(someObject)
calls that object's toString()
function to convert the object to a string representation.
If your object defines its own toString()
method, then that is what will be called. If you don't provide such a method, then your object will inherit toString()
from one of its parent classes. In the worst case, it will inherit Object.toString()
. That version of toString() is defined to return
a string consisting of the name of the class of which the object is an instance, the at-sign character `@', and the unsigned hexadecimal representation of the hash code of the object.
Or, in other words:
getClass().getName() + '@' + Integer.toHexString(hashCode())
So, when you call System.out.println()
on an object that doesn't define its own version of toString(), you might get the Object
version which produces a string in the form "classname@someHexNumber".