Java 中的 'System.out.println()' 和 'toString()' 之间的连接

2022-09-03 06:12:00

在 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 类运行,它将输出为 .当我删除覆盖的代码时,它会给出一个输出。那么,任何人都可以解释当我将对象引用作为参数传递给它时的工作原理是什么?它与方法完全连接吗?"abc"toString()"A@659e0bfd"System.out.println()objtoString()


答案 1

System.out 是一个 PrintStream。Printstream 定义了该函数的多个版本来处理数字、字符串等。使用任意对象作为参数进行调用时,将获得作用于 Object 的函数的版本。此版本的函数println()PrintStream.println()

...首先调用 String.valueOf(x) 以获取打印对象的字符串值...

看看 String.valueOf(Object),我们看到它返回

如果参数为空,则字符串等于“null”;否则,将返回 obj.toString() 的值。

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

如果你的对象定义了它自己的函数,那么这就是所谓的。如果不提供这样的函数,则对象将从其父类之一继承。在最坏的情况下,它将继承 Object.toString()。该版本的 toString() 被定义为返回toString()toString()

一个字符串,由对象是其实例的类的名称、at 符号字符“@”和对象哈希代码的无符号十六进制表示形式组成。

或者,换句话说:

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

因此,当您调用一个没有定义自己的toString()版本的对象时,您可能会得到看起来像“classname@someHexNumber”的版本。System.out.println()Object


答案 2

toString()是存在于所有类的类(继承树的根)中的方法。Object

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

如果不覆盖该方法,SOP 将调用父级,如果父级是 Object 类,则将打印对象的哈希代码toString()toString()

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