println隐式调用Java方法....为什么?

时间:2016-01-03 00:22:36

标签: java string

我有一个问题,为什么在main方法调用printPersonPrinting()方法时隐式调用toString()方法。

public class PersonPrinting {

    private String name;
    private int age;

    public PersonPrinting(String aName, int anAge) {
        name = aName;
        age = anAge;
    }

    public String toString() {
        return name + " " + age;
    }

    public void printPersonPrinting() {
        System.out.println(this);
    }

    public static void main (String [] args) {
        PersonPrinting p = new PersonPrinting("Dan",10);
        //printPersonPrinting is called, but toString isn't. 
       //But the output is formatted by toString method.
        p.printPersonPrinting();
    }
}

此代码的输出是 - >丹10

谢谢!

3 个答案:

答案 0 :(得分:11)

这就是Java的工作方式。默认情况下,System.out.println()会调用其param对象上的toString()方法将其转换为字符串表示形式。

如果对象的类没有覆盖toString()方法,则可能会得到类似className@someHexadecimalNumber的结果。 (这是toString()类中Object方法默认实现的结果)

答案 1 :(得分:8)

因为System.out.println(this);调用

String.valueOf(this)

反过来调用

this.toString()

它基本上是System.out.println(this.toString());

System.outPrintStream,因此您可以看到PrintStream.println(Object)(部分)

  

此方法首先调用String.valueOf(x)来获取打印对象的字符串值,然后就像调用print(String)然后调用println()一样。

答案 2 :(得分:2)

  

Java方法隐式调用...为什么?

一个答案是(基本上),这是指定println(Object)工作的方式。

另一个答案是,这是最好的(简单)设计选择。考虑:

  • println(Object)应该输出对象的文本呈现

  • 有两种选择:

    • 使用通用机制呈现对象

    • 使用渲染方法(如toString()

  • 考虑"泛型机制",它将如何决定要渲染的对象的哪些字段以及如何渲染它们?除非程序员能够以某种方式定制渲染,否则通用机制不可能“正确”#34;。与编写toString()方法相比,剪裁可能更复杂

  • 考虑toString()方法,可以重写该方法,以便像程序员想要的那样呈现对象。

现在可以肯定的是,一种简单的toString()方法往往不够灵活,但可以通过各种方式解决; e.g。

  • 使用PrintWriter.format(...)进行格式化/写作,或

  • 使用生成字符串和PrintWriter.print(String)

  • 的格式化程序

(对于需要渲染和输出大量文本的情况,您需要使用不同的方法;即不是PrintWriter。这是一个不同的主题。)