Java 隐式转换为字符串-toString和int+&引用&引用;

Java 隐式转换为字符串-toString和int+&引用&引用;,java,casting,implicit,Java,Casting,Implicit,为什么我使用这个: int a = 1; methodWithParamString(a + ""); a被强制转换为字符串,但我不能对整数使用toString() int a = 1; methodWithParamString(a.toString()); 这是不是:a+“”的工作原理类似于:a.toString()+“” 否。int是一种基本类型,因此它不是对象,不能有任何方法。 我想这会有帮助的。有一些用于原语的包装类,例如Integer用于int。您可以为它们调用toString(

为什么我使用这个:

int a = 1;
methodWithParamString(a + "");
a被强制转换为字符串,但我不能对整数使用toString()

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

这是不是:
a+“”
的工作原理类似于:
a.toString()+“”

否。
int
是一种基本类型,因此它不是对象,不能有任何方法。
我想这会有帮助的。有一些用于原语的包装类,例如
Integer
用于
int
。您可以为它们调用
toString()
方法。

实际上,
String
在java中是一个特殊的类。您可以对字符串和原语使用+(而不仅仅是)运算符。我想你会找到你问题的完整答案

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

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

toString()
Object
类中的一个方法,从它继承的任何类都将具有该方法,如
Integer
String
。但是
int
是一种基本类型而不是对象,因此该方法不存在。

否,它的工作原理类似于
String.valueOf(a)+“
,其行为又类似于
新的StringBuilder(String.valueOf(a)).append(”).toString()

需要知道的重要一点是,这一切都是由编译器完成的,换句话说,这是语法上的糖分。例如,这就是为什么在循环中添加字符串不是一个好主意。(尽管现代虚拟机可能有一些机制来减少性能开销。)

这个:a+“”的工作原理是否类似于:a.toString()+“”

对。没有

+
在内部重载。Java不支持对原语的方法调用

一根弦被抛到弦上

否。它已转换为字符串。(不能隐式或显式地将基元类型强制转换为字符串。)

JLS-中规定了此转换的详细信息。该规范规定,对于基元类型,转换是“好像”创建了相应包装类型的实例,然后在其上调用
toString()
。这使得Java编译器可以选择使用其他方法,只要最终结果相同。(对于引用类型,通过调用
toString()
,将
null
转换为
“null”
,并将其他非字符串类型转换为字符串)


JLS声明,然后通过调用
String.concat(…)
“仿佛”执行连接,注意JLS明确允许优化连接序列。(JLS)

在Java中实现这一点的方法实际上比其他答案所建议的要简单一些

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

请记住,每当一个原语被传递到一个对象有效的上下文时,Java就会执行“自动装箱”,将
int
转换为
Integer
,将
double
转换为
double
,等等

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


同时,您应该认识到,如果结果相同,则允许JVM实现优化自动装箱,因此您的JVM可以使用StringBuilder,或者使用任何其他有效的JVM字节码来创建生成的字符串,因此,字符串连接运算符的性能通常比自己装箱要好。

好的,我知道。但是这个:a+“”是如何工作的呢?隐式使用的是类似于:String.valueof(a)的东西吗?谢谢,这就是我想要的:)你能提供一些关于这个的文档链接吗?这里:在15.18.1.2中,它说的与这个答案类似。顺便说一句:
String.valueof(a)
只是调用
Integer.toString(a)
以下是Java 7中上述评论的证明:除非您没有使用过时的Java版本,否则不要使用
新整数(a)
其中a是整数。您应该依赖自动装箱或使用
Integer.valueOf(a)
因为Java在内部缓存Integer等基本体的实例化,从而避免创建不必要的实例。