2014-10-27 2 views
1

Я знаю, что способ println объекта System.out может использоваться для печати любого объекта, независимо от того, к какому классу он принадлежит. Но может ли кто-нибудь сказать мне механизм, который использует println для выполнения этой задачи?Какой механизм использует println?

+3

Почему вы не смотрите на исходный код один раз? –

+0

@ sᴜʀᴇsʜᴀᴛᴛᴀ механизм не сразу очевиден. –

+2

@ ThorbjørnRavnAndersen: по крайней мере, в JDK 7 'println (Object o)' просто вызывает 'String.valueOf (o)', который, в свою очередь, проверяет 'null' и вызывает' o.toString() '. Это всего лишь три клика в среде IDE, чтобы узнать ... – Axel

ответ

7

Вызов System.out.println на объекте использует Object «s toString() метод - либо реализация по умолчанию в Object классе, или реализации классов, которые переопределяют это значение по умолчанию.

System.out.println, в конце концов использует один из различных методов printlnPrintStream «ы, так как System.out является PrintStream экземпляром.

Если вы передадите String на номер System.out.println, он позвонит println(String). Если вы передадите ему char[], он назовет println(char[]). Если вы передадите любой другой тип Object, он вызовет println(Object) (если компилятор не решает преобразовать Object в String, используя метод toString() объекта, а затем позвоните по номеру println(String)).

println(Object x) преобразует Object к String по телефону String.valueOf(), который возвращает либо «нуль» (для нулевых объектов) или obj.toString().

В любом случае используется метод ObjecttoString(), если только Object не имеет значения.

+1

Метод 'println' принимает только вход' String'. Логика компилятора использует метод 'toString()', когда это необходимо. Поскольку 'println' ожидает' String', а не 'Object' (если это не объект' String'), компилятор преобразует объект в 'String' с помощью метода' toString() '. Это не что иное, как выполнение следующего: 'final Object o = new SomeObject(); final String oString =" "+ o;' – Jared

+2

@Jared 'println' перегружен, чтобы принять вход' Object' (также 'boolean' , 'int',' float' и т. д.). Вы можете видеть это из API. – khelwood

+1

@ Jared PrintStream имеет много перегруженных версий println.Некоторые принимают примитивы, один принимает строку и принимает объект. – Eran

-1

Существует очень мало различий между тем, как PrintStream/PrintWriter.println(...) обрабатывает String и способ компилятора обрабатывает String. Потоки печати автоматически преобразуют Object в String с помощью метода toString(), если только этот объект не является null (в этом случае он печатает null). Разница заключается в том, что вы не можете установить String объект общей Object --but вы можете сцепить в String объект с общей целью 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; 
    } 
} 

Вот выход из этой программы:

o1 by itself (below): 
null 
o1's toString(): o1.toString() failed 
o1's "" + o1: null 
o2 by itself (below): 
blah blah blah 
o2's toString(): blah blah blah 
o2's "" + o1: blah blah blah 
Смежные вопросы