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

问题描述 投票:11回答:3

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

如果主类运行,它将输出为"abc"。当我删除覆盖toString()的代码时,它会输出"A@659e0bfd"。那么,当我将System.out.println()对象引用作为参数传递给它时,任何人都能解释obj的工作原理是什么吗?它是否与toString()方法完全相关?

java class override tostring
3个回答
14
投票

System.out是一个PrintStream。 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()时,您可能会获得类似于“classname @ someHexNumber”的Object版本。


3
投票

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

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

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

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


0
投票

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

 getClass().getName() + '@' + Integer.toHexString(hashCode())
© www.soinside.com 2019 - 2024. All rights reserved.