Когда я использую System.out.println(obj.getClass())
, это не дает мне никакой ошибки. Из того, что я понимаю, getClass()
возвращает тип класса.
Поскольку println()
будет печатать только строки, как вместо класса, println
получает строку?
Ява. getClass() возвращает класс, откуда я могу получить строку?
Ответ 1
Все объекты в Java наследуются от класса Object. Если вы посмотрите на этот документ, вы увидите, что Object
указывает метод toString
, который преобразует объект в строку. Поскольку все непримитивные типы (включая Class
es) Object
s, все может быть преобразовано в строку с использованием метода toString
.
Классы могут переопределять этот метод, чтобы обеспечить собственный способ превращения в строку. Например, класс String
переопределяет Object.toString
для возврата. Class
переопределяет его, чтобы вернуть имя класса. Это позволяет указать, как вы хотите, чтобы ваш объект был выведен.
Ответ 2
System.out.println(someobj)
всегда эквивалентен:
System.out.println(String.valueOf(someobj));
И для непустых значений someobj, который печатает someobj.toString();
В вашем случае вы делаете println(obj.getClass())
, чтобы вы действительно делали:
System.out.println(String.valueOf(obj.getClass()));
который вызывает метод toString
для класса.
Ответ 3
Смотрите код:
787 public void println(Object x) {
788 String s = String.valueOf(x);
789 synchronized (this) {
790 print(s);
791 newLine();
792 }
793 }
Обратите внимание на String.valueOf(x)
.
Бонус за задание хорошего вопроса:
632 public void print(String s) {
633 if (s == null) {
634 s = "null";
635 }
636 write(s);
637 }
Вот почему он печатает null
, когда объект имеет значение null:)
Ответ 4
Как вы, наверное, знаете, каждый класс в Java наследуется от класса Object
. Это означает, что каждый класс автоматически имеет метод toString()
, который возвращает представление объекта как String
. Когда вы объединяете строку с объектом или передаете Object
в аргумент, где должен быть String
, Java автоматически вызывает метод toString()
, чтобы преобразовать его в String
. В вашем случае метод toString()
был переопределен, чтобы вернуть имя класса.
Вы можете видеть, что это происходит и с другими объектами:
Set s = new Set();
s.add(1);
s.add(3);
s.add(5);
System.out.println(s);
выведет "[1, 3, 5]".