gpt4 book ai didi

java - toString 的显式与隐式调用

转载 作者:IT老高 更新时间:2023-10-28 20:53:32 26 4
gpt4 key购买 nike

当我想要一些关于对象的调试信息时,我曾经使用隐式调用 toString,因为如果对象为空,它不会抛出异常。

例如:

System.out.println("obj: "+obj);

代替:

System.out.println("obj: "+obj.toString());

除了null case有什么区别吗?
后一种情况是否可行,而前一种情况则不行?

编辑:
在隐式调用的情况下到底做了什么?

最佳答案

差别不大。使用更短且工作更频繁的那个。

如果您出于其他原因确实想要获取对象的字符串值,并且希望它对 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(),你绕过空检查和堆栈帧,直接在StringBuilder中进行:

public StringBuilder append(String str) {
super.append(str);
return this;
}

所以...在这两种情况下都会发生非常相似的事情。一个人只是做更多的工作。

关于java - toString 的显式与隐式调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/328661/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com