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 回答
System.out.println(someobj)
总是等价于:
System.out.println(String.valueOf(someobj));
并且,对于 的非空值someobj
,打印someobj.toString();
就你而言,你正在这样做println(obj.getClass())
,你真的在做:
System.out.println(String.valueOf(obj.getClass()));
这是调用toString
类上的方法。
Java 中的所有对象都继承自Object类。如果您查看该文档,您会看到它Object
指定了一个toString
将对象转换为字符串的方法。由于所有非原始类型(包括Class
es)都是Object
s,所以任何东西都可以使用它的方法转换为字符串toString
。
类可以重写此方法以提供自己的方式将其转换为字符串。例如,String
类重写Object.toString
以返回自身。Class
覆盖它以返回类的名称。这使您可以指定要如何输出对象。
见代码:
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
在对象为空时打印:)
您可能知道,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]”。