Java. getClass() 方法返回一个类,为什么我也能得到一个字符串?

14

当我使用System.out.println(obj.getClass())时,它没有给我任何错误。据我所知,getClass()返回一个Class类型。由于println()只会打印字符串,那么为什么println获得的不是类,而是一个字符串呢?


1
obj.getClass().getName()?还是obj.getClass().toString() - Maxim Shoustin
4个回答

38

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

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

对于非null值的someobj,它会打印出someobj.toString();

在您的情况下,您正在执行println(obj.getClass()),因此您实际上正在执行:

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

调用类上的toString方法。


2
PrintStream.println(Object) 的 API 文档中写道:“该方法首先调用 String.valueOf(x) 方法,以获取要打印对象的字符串值…” - Andy Thomas
1
抱歉问一个小问题,为什么要使用String.valueOf()而不是object.toString()?我注意到Java API的其他部分也使用了String.valueOf,而我通常会使用后者。 - devrobf
6
String.valueOf(Object obj) 的标准定义为 return (obj == null) ? "null" : obj.toString();,因此它基本上是相同的,只需添加了对 null 的处理。 - Keppil

20
在Java中,所有对象都继承自类Object。如果您查看该文档,您会发现Object指定了一个toString方法,用于将对象转换为字符串。由于所有非基本类型(包括Class)都是Object,因此可以使用其toString方法将任何内容转换为字符串。
类可以覆盖此方法以提供它们自己的方式来转换成字符串。例如,String类覆盖Object.toString以返回它自己。Class则覆盖它以返回类的名称。这使您可以指定输出对象的方式。

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时它会打印null :)

3
作为您可能已经知道的,Java中的每个类都继承自Object类。这意味着每个类都自动拥有toString()方法,该方法返回对象的表示形式作为字符串。当您将字符串与对象连接在一起时,或者如果您将一个对象传递到应该是字符串的参数中,Java会自动调用toString()方法将其转换为字符串。在您的情况下,toString()方法已被覆盖以返回类的名称。
您也可以看到其他对象发生这种情况。
Set s = new Set();
s.add(1);
s.add(3);
s.add(5);
System.out.println(s);

将输出 "[1, 3, 5]"。


+1,但我会使用不同的示例,因为Integer可以隐式转换。 - nullptr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接