为什么当我使用这个时:
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()
。a 转换为 String 类型
不是。它被转换为 String 类型。(你无法将原始类型隐式或显式地转换为 String 类型。)
这种转换的详细信息在 JLS 中指定 - 15.18.1.1。规范说明,对于原始类型,转换是通过“仿佛”创建适当包装类型的实例然后调用其 toString()
方法来进行的。这使得 Java 编译器可以选择使用其他方法,只要最终结果相同即可。(对于参考类型,转换将把 null
转换为 "null"
,并通过调用 toString()
把其他非 String 类型转换为 String。)
String.concat(...)
方法执行,并且JLS明确允许对连接序列进行优化。(JLS 15.18.1.2)因为int a不是一个对象,而是原始类型。 所以它没有任何方法。 你应该使用装箱:
Integer objectA = new Integer(a);
objectA.toString();
new Integer(a)
,其中a是int类型。你应该依赖于自动装箱或使用Integer.valueOf(a)
,因为Java内部缓存原始类型(如Integer)的实例化,从而避免创建不必要的实例。 - AxeltoString()
是 Object
类中的一个方法,任何继承自它的类都将拥有该方法,例如 Integer
或 String
。但是,int
是原始类型而不是对象,因此该方法不存在。
String.valueOf(a)
只是调用了Integer.toString(a)
。 - Peter Lawrey