隐式强制转换为字符串 - toString 和 int + " "



为什么当我使用它时:

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中的一个方法,任何从它继承的类都会有该方法,如IntegerString。 但是int是基元类型而不是对象,因此该方法不存在。

No.int 是基元类型,因此它不是对象,不能有任何方法。
阅读本文,我认为这会有所帮助。例如,有用于原语的包装类Integer用于int。您可以为它们调用toString()方法。
实际上String是Java中的一个特殊类。您可以对字符串和基元使用 +(不仅是(运算符。我想你会在这里找到你问题的完整答案。

最新更新