Ява. getClass() возвращает класс, откуда я могу получить строку?

Когда я использую System.out.println(obj.getClass()), это не дает мне никакой ошибки. Из того, что я понимаю, getClass() возвращает тип класса. Поскольку println() будет печатать только строки, как вместо класса, println получает строку?

Ответ 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]".