Когда я использую 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]".