想要有关对象的某些调试信息时,我曾经使用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;
}
所以…在两种情况下都会发生非常相似的事情。一个人只会做更多的工作。
问题内容: 显式内部连接与隐式内部连接是否存在效率差异?例如: 与 问题答案: 在性能方面,它们是完全相同的(至少在SQL Server中)。 PS:请注意,自SQL Server 2005起不赞成使用该语法。(仍支持问题中使用的语法) 弃用“旧样式” JOIN语法:只是部分事情
我有一个结构,下面的运算符声明: 仅此运算符就可以将不可为null的结构隐式转换为int,但尝试隐式转换其可为null的对应结构仍会引发编译错误: 无法隐式转换类型
问题内容: 据说我们不能 在Java中强制执行该过程。 毕竟是守护线程。 但是仍然有时,为什么我们显式调用该函数? 值得打电话吗?有专业人士吗? 如果在许多情况下没有用,为什么Java不推荐使用此方法? PS:举例说明会很有用 问题答案: 我认为,认为该方法的最佳方法是作为垃圾回收应运行的虚拟机的“提示”。就是说,就像人们认为自己正在执行的“优化”中有很大一部分一样,通常最好是让系统自行处理。系统
问题内容: 我在使用Hibernate生成无效SQL时遇到问题。具体来说,混合和匹配隐式和显式联接。这似乎是一个开放的错误。 但是,我不确定 为什么 这是无效的SQL。我想出了一个生成相同语法异常的小型玩具示例。 架构图 数据 工作SQL 这两个查询均有效。我意识到有笛卡尔积;那是故意的。 明确加入: 隐式加入: 无效的SQL 此查询不适用于MSSQL 2000/2008或MySQL: 在MS20
本文向大家介绍Android隐式和显式意图,包括了Android隐式和显式意图的使用技巧和注意事项,需要的朋友参考一下 示例 显式意图用于在同一应用程序包内启动活动或服务。在这种情况下,将明确提及所需类的名称: 但是,对于用户设备上安装的可以处理该意图的任何应用程序,系统会在系统上发送隐式意图。这用于在不同应用程序之间共享信息。 可以在Android Developer文档中找到有关差异的更多详细
本文向大家介绍VBA 隐式和显式声明,包括了VBA 隐式和显式声明的使用技巧和注意事项,需要的朋友参考一下 示例 如果代码模块不包含Option Explicit在模块顶部,则编译器将在使用它们时自动(即“隐式”)为您创建变量。它们将默认为变量类型Variant。 在上面的代码,如果Option Explicit指定,代码将中断,因为它缺少必要Dim的陈述someVariable和someOthe