Ответ 1
System.out
является PrintStream
. Printstream определяет несколько версий функции println()
для обработки чисел, строк и т.д. Когда вы вызываете PrintStream.println()
с произвольным объектом в качестве параметра, вы получаете версию функции, действующую на Object
. Эта версия функции
... вызывает сначала String.valueOf(x), чтобы получить значение строки печатного объекта...
Рассматривая String.valueOf(Object)
, мы видим, что он возвращает
если аргумент равен null, тогда строка равна "null"; в противном случае возвращается значение obj.toString().
Итак, длинный рассказ, System.out.println(someObject)
вызывает эту объектную функцию toString()
для преобразования объекта в строковое представление.
Если ваш объект определяет свою собственную функцию toString()
, то это то, что будет вызываться. Если вы не предоставляете такую функцию, ваш объект наследует toString()
из одного из своих родительских классов. В худшем случае он наследует Object.toString()
. Эта версия toString() определена для возврата
строка, состоящая из имени класса, объектом которого является экземпляр, символа at-sign `@'и шестизначного шестнадцатеричного представления хеш-кода объекта.
Или, другими словами:
getClass().getName() + '@' + Integer.toHexString(hashCode())
Итак, когда вы вызываете System.out.println()
на объект, который не определяет свою собственную версию toString(), вы можете получить версию Object
, которая выглядит как "classname @someHexNumber".