println使用什么机制?

时间:2014-10-27 07:50:55

标签: java

我知道println对象的System.out方法可用于打印任何对象,无论它属于哪个类。但有人能告诉我println用来完成这项任务的机制吗?

2 个答案:

答案 0 :(得分:7)

在对象上调用System.out.println使用Object的{​​{1}}方法 - toString()类中的默认实现,或者覆盖此类的类的实现默认值。

System.out.println最终使用ObjectPrintStream种方法之一,因为printlnSystem.out个实例。

如果您将PrintStream传递给String,则会致电System.out.println。如果您将println(String)传递给它,则会调用char[]。如果您传递任何其他类型的println(char[]),它将调用Object(除非编译器决定将println(Object)转换为Object,使用对象' { {1}}方法,然后再调用String

toString()通过调用println(String)println(Object x)转换为ObjectString将返回" null" (对于null对象)或String.valueOf()

无论哪种方式,都使用obj.toString() Object方法,除非toString()为空。

答案 1 :(得分:-1)

PrintStream/PrintWriter.println(...)对待String的方式与编译器对待String的方式之间的差异非常小。打印流将通过Object方法自动将String转换为toString(),除非该对象为null(在这种情况下,它会打印null)。不同之处在于您无法将String对象设置为常规Object - 但可以String对象与通用{{1}连接在一起}将通过Object方法连接(除非toString()Object)。坦率地说,这通常是你如何使用null方法。这是一个示例程序,说明了差异:

toString()

以下是该计划的输出:

public class PrintStreamTester {
    public static void main(String... args) {
        final MyObject o1 = null;
        final MyObject o2 = new MyObject("blah blah blah");

        String s1 = "o1.toString() failed";

        try {
            s1 = o1.toString();
        } catch (NullPointerException npe) {
            // who cares
        }
        final String s2 = "" + o1;
        final String s3 = o2.toString();
        final String s4 = "" + o2;

        System.out.println("o1 by itself (below):");
        System.out.println(o1);
        System.out.println("o1's toString(): " + s1);
        System.out.println("o1's \"\" + o1: " + s2);

        System.out.println("o2 by itself (below):");
        System.out.println(o2);
        System.out.println("o2's toString(): " + s3);
        System.out.println("o2's \"\" + o1: " + s4);
    }
}

class MyObject {
    private final String string;

    public MyObject(final String string) {
        this.string = string;
    }

    @Override
    public String toString() {
        return string;
    }
}