13

When I use System.out.println(obj.getClass()) it doesn't give me any error. From what I understand getClass() returns a Class type. Since println() will print only strings, how come instead of a class, println is getting a String?

4

4 回答 4

37

System.out.println(someobj)总是等价于:

System.out.println(String.valueOf(someobj));

并且,对于 的非空值someobj,打印someobj.toString();

就你而言,你正在这样做println(obj.getClass()),你真的在​​做:

System.out.println(String.valueOf(obj.getClass()));

这是调用toString类上的方法。

于 2013-05-05T14:25:02.270 回答
19

Java 中的所有对象都继承自Object类。如果您查看该文档,您会看到它Object指定了一个toString将对象转换为字符串的方法。由于所有非原始类型(包括Classes)都是Objects,所以任何东西都可以使用它的方法转换为字符串toString

类可以重写此方法以提供自己的方式将其转换为字符串。例如,String类重写Object.toString以返回自身。Class覆盖它以返回类的名称。这使您可以指定要如何输出对象。

于 2013-05-05T14:24:51.530 回答
4

代码

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在对象为空时打印:)

于 2013-05-05T14:29:46.777 回答
3

您可能知道,Java 中的每个类都继承自Object该类。这意味着每个类都自动具有方法toString(),该方法将对象的表示形式返回为String. 当您将字符串与对象连接时,或者如果您将 an 传递Object到应该有 a 的参数中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]”。

于 2013-05-05T14:26:01.667 回答