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


什么是连接 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(),它给出一个输出 "A@659e0bfd"。那么,任何人都可以解释什么是工作原理 System.out.println() 当我使用参数作为对象?是否与之完全相关 toString() 方法?


9548
2018-03-28 15:36


起源



答案:


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()被定义为返回

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

或者,换句话说:

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

所以,当你打电话的时候 System.out.println() 在没有定义自己的toString()版本的对象上,你可能得到了 Object 看起来像“classname @ someHexNumber”的版本。


13
2018-03-28 15:56





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

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

如果您不覆盖该方法 toString(),SOP将致电父母 toString() 其中,如果parent是Object类,它将打印该对象的hashCode

如果您覆盖该方法,SOP将拨打您的电话 toString() 方法


3
2018-03-28 15:41





System.out.println(obj)将从obj.toString()打印返回的字符串,如果你不覆盖它,它将调用基础object.toString()方法,默认情况下,类Object的toString方法返回一个由对象是实例的类的名称,at符号字符“@”,以及对象的哈希码的无符号十六进制表示。换句话说,此方法返回一个等于值的字符串:

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

0
2018-03-28 15:45