显式与隐式调用toString
想要有关对象的某些调试信息时,我曾经使用toString的隐式调用,因为在对象为null的情况下,它不会引发Exception。
例如:
System.out.println("obj: "+obj);
代替:
System.out.println("obj: "+obj.toString());
除了null以外,还有什么区别吗?
如果前者不起作用,后者可以工作吗?
编辑:
在隐式调用的情况下,到底做了什么?
回答:
没有什么区别。使用较短且经常使用的那一种。
如果您实际上由于其他原因想要获取对象的字符串值,并且希望它为null友好,请执行以下操作:
String s = String.valueOf(obj);
:问题已扩展,所以我将扩展我的答案。
在这两种情况下,它们都将编译为以下内容:
System.out.println(new StringBuilder().append("obj: ").append(obj).toString());
当您的内容toString()
是隐式的时,您将在第二个附录中看到。
如果您查看Java的源代码,您将看到StringBuilder.append(Object)
如下所示:
public StringBuilder append(Object obj) { return append(String.valueOf(obj));
}
其中,String.valueOf
如下所示:
public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString();
}
现在,如果您toString()
自己,可以绕过null检查和堆栈框架,然后直接在StringBuilder
:
public StringBuilder append(String str) { super.append(str);
return this;
}
所以…在两种情况下都会发生非常相似的事情。一个人只会做更多的工作。
以上是 显式与隐式调用toString 的全部内容, 来源链接: utcz.com/qa/407820.html