Who says it calls toString()?
System.out is a PrintStream, and if you look at the API documentation for the print(Object) method it says
"The
string produced by the String.valueOf(Object) method is translated into bytes..."
And when you look at the API documentation for String's valueOf(Object) method it says
"Returns: if the argument is null, then a string equal to "null"; otherwise, the value of obj.toString() is returned."
So that's why.