显式与隐式调用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

回到顶部