隐式转换为字符串 - toString和int +“”

时间:2012-02-06 11:22:40

标签: java casting implicit

为什么当我使用它时:

int a = 1;
methodWithParamString(a + "");

a被强制转换为String,我不能在整数上使用toString()吗?

int a = 1;
methodWithParamString(a.toString());

这不是:a+""的作用如下:a.toString() + ""

7 个答案:

答案 0 :(得分:9)

不,它的工作方式与String.valueOf( a ) + ""类似,后者的行为与new StringBuilder( String.valueOf( a ) ).append( "" ).toString()相似。

重要的是要知道它完全由编译器完成,换句话说就是它的语法糖。这就是为什么在循环中将字符串组合在一起并不是一个好主意。 (尽管现代VM可能有一些机制来降低性能开销。)

答案 1 :(得分:6)

  

a被强制转换为String

没有。它被转换到一个字符串。 (您无法隐式或显式地将基本类型转换为String。)

此转换的详细信息在JLS中指定 - 15.18.1.1。该规范规定,对于基本类型,转换完成"好像"您创建了一个适当的包装类型的实例,然后在其上调用toString()。这使得Java编译器可以选择使用其他方法,只要最终结果相同。 (对于引用类型,转换通过调用null"null"转换为toString(),将其他非String类型转换为String。)

JLS声明然后执行连接"好像"通过调用String.concat(...),注意到JLS明确允许优化连接序列。 (JLS 15.18.1.2

答案 2 :(得分:2)

  

这不是:a +“”的作用类似于:a.toString()+“”?

真。它没有。

+内部超载。和Java不支持对基元的方法调用。

答案 3 :(得分:0)

不。int是一种原始类型,因此它不是一个对象,并且不能有任何方法。
阅读this我认为这会有所帮助。有基元的包装类,例如Integer的{​​{1}}。您可以为他们调用int方法 实际上toString()是java中的一个特殊类。并且您可以对字符串和基元使用+(而不仅仅是)运算符。我想您会找到问题here的完整答案。

答案 4 :(得分:0)

因为int a - 不是对象,所以它是原始类型。 所以它没有任何方法。 你应该使用拳击:

Integer objectA = new Integer(a);
objectA.toString();

答案 5 :(得分:0)

toString()Object类中的一种方法,任何从中继承的类都将使用该方法,例如IntegerString。但是int是原始类型而不是Object,因此该方法不存在。

答案 6 :(得分:0)

在Java中实现这一点的方式实际上比其他答案似乎更简单。

将字符串连接运算符与String和对象一起使用会导致调用该对象的toString()方法,然后执行字符串连接。

请记住,只要将原语传递给Object有效的上下文,Java就会执行" autoboxing",将int转换为Integer,{{1转到double等等。

因此,您可以将其视为自动装箱,然后是toString(),后跟字符串连接。

同时,您应该意识到JLS string concatenation spec允许JVM实现优化自动装箱,只要结果相同,因此您的JVM可以使用StringBuilder,或使用任何其他有效的JVM字节码创建结果字符串,所以字符串连接运算符的性能通常比自己执行拳击更好。