为什么当我使用它时:
int a = 1;
methodWithParamString(a + "");
a 被强制转换为字符串,但我不能在整数上使用 toString((?
int a = 1;
methodWithParamString(a.toString());
这不是:a+""
的工作原理是:a.toString() + ""
?
不,它的工作方式类似于 String.valueOf( a ) + ""
,而 又表现得像new StringBuilder( String.valueOf( a ) ).append( "" ).toString()
。
重要的是要知道这一切都是由编译器完成的,换句话说,它是语法糖。这就是为什么在循环中添加字符串不是一个好主意的原因。(尽管现代 VM 可能具有一些机制来降低性能开销。
a 被强制转换为字符串
不。 它被转换为字符串。 (不能将基元类型隐式或显式强制转换为 String。
此转换的详细信息在 JLS - 15.18.1.1 中指定。 该规范指出,对于基元类型,转换是"好像"您创建了适当包装类型的实例,然后在其上调用toString()
。 这使得 Java 编译器可以选择使用其他方法,前提是最终结果相同。 (对于引用类型,转换通过调用toString()
将null
转换为 "null"
,将其他非字符串类型转换为字符串。
JLS指出,连接然后通过调用String.concat(...)
"好像"来执行,并指出JLS明确允许优化串联序列。 (JLS 15.18.1.2(
这不是:a+"的工作方式是这样的:a.toString(( + " 吗?
没错,其实不然。
+
在内部过载。 并且 Java 不支持对原语进行方法调用。
在Java中完成此操作的方式实际上比其他答案似乎要简单一些。
将字符串串联运算符与 String 和对象一起使用会导致调用该对象的 toString()
方法,然后执行字符串串联。
请记住,每当将原语传递到对象有效的上下文时,Java都会执行"自动装箱",将int
转换为Integer
,将double
转换为Double
等。
因此,您可以将其视为自动装箱,然后是toString((,然后是字符串连接。
同时,您应该意识到,JLS 字符串串联规范允许 JVM 实现优化自动装箱,前提是结果相同,因此您的 JVM 可能会改用 StringBuilder,或者使用任何其他有效的 JVM 字节码来创建生成的字符串,因此字符串连接运算符的性能通常比自己执行装箱要好。
因为int a - 不是对象,所以它是基元类型。所以它没有任何方法。您应该使用拳击:
Integer objectA = new Integer(a);
objectA.toString();
toString()
是类Object
中的一个方法,任何从它继承的类都会有该方法,如Integer
或String
。 但是int
是基元类型而不是对象,因此该方法不存在。
No.int
是基元类型,因此它不是对象,不能有任何方法。
阅读本文,我认为这会有所帮助。例如,有用于原语的包装类Integer
用于int
。您可以为它们调用toString()
方法。
实际上String
是Java中的一个特殊类。您可以对字符串和基元使用 +(不仅是(运算符。我想你会在这里找到你问题的完整答案。