Почему оператор печати вызывает метод **toString** в java?

Почему следующий сегмент кода автоматически вызывает метод toString()?

Код:

public class Demo {
   public Demo() {
    System.out.println(this); // Why does this line automatically calls toString()?
    }

   public static void main(String[] args) {
    Demo dm = new Demo();
   }
}

person dip    schedule 28.02.2014    source источник
comment
Тогда что бы вы хотели, чтобы он напечатал?   -  person Rohit Jain    schedule 28.02.2014
comment
Опубликовать исполняемый код. Это ужасно искаженный и недействительный код.   -  person user2357112 supports Monica    schedule 28.02.2014
comment
Это дизайнерское решение. Также было бы возможно, почему бы не вызвать, поскольку предполагается, что toString дает строковое представление объекта.   -  person Audrius Meskauskas    schedule 28.02.2014
comment
@user2357112 user2357112 у тебя нет компилятора Java или JDK?   -  person dip    schedule 28.02.2014
comment
Не тот, который распознает ublic или Syatem.   -  person user2357112 supports Monica    schedule 28.02.2014


Ответы (4)


println перегружен для различных типов, тот, который вы вызываете:

java.io.PrintStream.println(java.lang.Object)

Что выглядит так:

public void println(Object x) {
  String s = String.valueOf(x);
  synchronized (this) {
    print(s);
    newLine();
  }
}

А String.valueOf выглядит так:

public static String valueOf(Object obj) {
  return (obj == null) ? "null" : obj.toString();
}

Итак, вы можете видеть, что он вызывает toString() для вашего объекта. КЭД

person weston    schedule 28.02.2014

Разработчики Java решили, что они хотят сделать печать любого объекта красивой и простой, используя такие операторы, как

System.out.println(something);
System.out.print(something);
someOtherPrintWriter.println(something);

программисту не нужно слишком беспокоиться о том, что на самом деле представляет собой something, поэтому они сделали множество версий этих методов. Но они не могли предвидеть каждый возможный класс, объект которого кто-то может захотеть напечатать.

Но поскольку каждый класс прямо или косвенно расширяет Object, все, что им нужно было сделать, это сделать любой экземпляр Object пригодным для печати, что в основном означало предоставление способа преобразования любого Object в String.

Они сделали это, включив метод toString в класс Object и заставив print и println использовать его. Затем, если кто-то напишет класс и ему нужно, чтобы объекты печатались определенным образом, все, что ему нужно сделать, это переопределить toString, и тогда print и println будут делать то, что ожидает программист.

person Dawood ibn Kareem    schedule 28.02.2014
comment
снимаю шляпу :) большое спасибо! - person dip; 28.02.2014

когда вызывается System.out.println(), он пытается что-то напечатать на экране (очевидно). Единственное, что можно напечатать, — это строка, поэтому каждый объект, который вы передаете методу в качестве параметра, будет «преобразован» во что-то, что может быть записано на выходе, поэтому он вызывает метод .toString()

person Sloth    schedule 28.02.2014

Java-код для печати объекта

 public void println(Object paramObject)
      {
        String str = String.valueOf(paramObject); // Use valueOf method
        synchronized (this) {
          print(str);
          newLine();
        }
      }

метод valueOf строки

public static String valueOf(Object paramObject)
  {
    return paramObject == null ? "null" : paramObject.toString(); // toString() method is called
  }
person Kick    schedule 28.02.2014