'System.out.println()'和'toString()'在Java中的联系

The connection between 'System.out.println()' and 'toString()' in Java

Java中的System.out.println()toString()有什么联系?例如:

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

如果 main class 运行,它给出的输出为 "abc"。当我删除覆盖 toString() 的代码时,它给出的输出为 "A@659e0bfd"。那么,当我将 obj 对象引用作为参数传递给它时,谁能解释一下 System.out.println() 的工作原理是什么?是否与toString()方法完全连接?

toString() 是存在于 Object class(继承树的根)中的方法,适用于所有 classes.

System.out.print() (SOP) 将在输入对象时调用 toString 方法。

如果你不覆盖方法toString(),SOP会调用parenttoString(),如果parent是对象class,它会打印对象的hashCode

如果您覆盖该方法,SOP 将调用您的 toString() 方法

System.out.println(obj) 将打印从 obj.toString() 返回的字符串,如果您不覆盖它,它将调用基础 object.toString() 方法,默认情况下是 toString 方法对于 class 对象 returns 一个字符串,包含 class 的名称(对象是其实例)、at 符号字符“@”和哈希的无符号十六进制表示对象的代码。也就是说,这个方法returns一个字符串等于的值:

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

System.out is a PrintStream. Printstream defines several versions of the println() function 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 function that acts on an Object。这个版本的函数

...calls at first String.valueOf(x) to get the printed object's string value...

查看 String.valueOf(Object),我们看到它 returns

if the argument is null, then a string equal to "null"; otherwise, the value of obj.toString() is returned.

所以,长话短说,System.out.println(someObject) 调用该对象的 toString() 函数将对象转换为字符串表示形式。

如果您的对象定义了它自己的 toString() 函数,那么它将被调用。如果您不提供这样的功能,那么您的对象将从其父 类 之一继承 toString()。最坏的情况下,它会继承Object.toString()。该版本的 toString() 定义为 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.

或者,换句话说:

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

因此,当您在未定义其自己的 toString() 版本的对象上调用 System.out.println() 时,您可能会得到类似于 "classname@someHexNumber" 的 Object 版本。