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

时间:2015-03-28 15:36:37

标签: java class override tostring

Java中System.out.println()toString()之间的联系是什么? e.g:

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()对象引用作为参数传递给它时,有人可以解释obj的工作原理是什么吗?它是否与toString()方法完全相关?

3 个答案:

答案 0 :(得分:13)

System.outPrintStream。 Printstream定义了println()函数的几个版本来处理数字,字符串等。当您使用任意对象作为参数调用PrintStream.println()时,您将获得the version of the function that acts on an 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())

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

答案 1 :(得分:3)

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

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

如果你不覆盖方法toString(),SOP将调用父toString(),如果父是Object类,它将打印对象的hashCode

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

答案 2 :(得分:0)

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

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