2016-01-03 5 views
3

У меня возник вопрос о том, почему метод toString() неявно вызывается, когда основной метод вызывает метод printPersonPrinting().Метод Java, неявно называемый println .... почему?

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

Выход этого кода -> Dan 10

Спасибо !!

+0

Обратите внимание, что ваш метод 'toString' переопределяет' Object.toString', который не сразу становится понятным, потому что в вашем коде отсутствует аннотация '@ Override'. –

+1

Как еще можно распечатать объект? Как вы думаете, что это могло бы сделать вместо этого? – Raedwald

ответ

11

Это как раз работает Java. По умолчанию System.out.println() вызывает метод toString() в своем объекте param, чтобы преобразовать его в его строковое представление.

Если класс объекта не переопределяет метод toString(), вы можете получить в результате что-то вроде [email protected]. (который является результатом реализации по умолчанию метода toString() в Object классе)

8

Поскольку System.out.println(this); вызывает

String.valueOf(this) 

, который в свою очередь вызывает

this.toString() 

Это в основном System.out.println(this.toString());.

System.out является PrintStream, так что вы можете увидеть PrintStream.println(Object), который говорит (частично)

Этот метод вызывает сначала String.valueOf(x) получить значение строки печатного объекта, а затем ведет себя так, как будто он вызывает print(String) и затем println().

2

Метод Java неявно называется ... почему?

Один ответ (в основном), что это так, как указано для работы println(Object).

Другой ответ заключается в том, что это лучший (простой) вариант дизайна. Рассмотрим:

  • println(Object) предполагается выводить визуализации текста объекта

  • есть две альтернативы:

    • используют общий механизм для придания объекту

    • использовать метод рендеринга (например, toString())

  • Учитывая «общий механизм», как он будет определять, какие поля объекта визуализировать, и как их отображать? Если программист не может каким-то образом выполнить рендеринг, невозможно, чтобы общий механизм «правильно понял».И пошив, может быть более сложным, чем написание метода toString().

  • с учетом подхода toString(), метод может быть переопределен для визуализации объекта по мере необходимости программистом или нет.

Теперь по общему признанию, простой toString() метод часто не достаточно гибким, но может быть решена в различных формах; например

  • использование PrintWriter.format(...) сделать форматирование/записи, или

  • использовать форматчик, который генерирует строку и PrintWriter.print(String).

(для ситуаций, когда вам нужно, чтобы сделать и выходные большие объемы текста, вам нужно использовать другой подход, т.е. не PrintWriter Это другая тема.).

Смежные вопросы