Связь между "System.out.println()" и "toString()" в Java

Какая связь между System.out.println() и toString() в Java? например:

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);
    }
}

Если основной класс работает, он выводит как "abc". Когда я удаляю код, который переопределяет toString(), он выводит как "[email protected]". Итак, может ли кто-нибудь объяснить, каков принцип работы System.out.println() когда я obj ссылку на obj в качестве аргумента? Это полностью связано с методом toString()?

Ответ 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".

Ответ 2

toString() - это метод, существующий в классе Object (корень дерева наследования) для всех классов.

System.out.print() (SOP) вызовет метод toString при подаче объекта.

Если вы не перезапишите метод toString(), SOP вызовет родительский toString(), который, если parent является классом Object, будет печатать хэш-код объекта

Если вы перезапишите метод, SOP вызовет ваш метод toString()

Ответ 3

System.out.println(obj) выведет возвращаемую строку из obj.toString(), если вы не переопределите ее, она вызовет метод base.toString(), который по умолчанию метод toString для класса Object возвращает строку состоящий из имени класса, объектом которого является экземпляр, символа at-sign `@'и шестизначного шестнадцатеричного представления хеш-кода объекта. Другими словами, этот метод возвращает строку, равную значению:

 getClass().getName() + '@' + Integer.toHexString(hashCode())