原始问题是这样的。
public class test {
public static void main(String[] args){
int i = '1' + '2' + '3' + "";
System.out.println(i);
}
}
这给了我一个错误:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Type mismatch: cannot convert from String to int
然后我改变了这样的代码:
public class test {
public static void main(String[] args){
int i = '1' + '2' + '3';
System.out.println(i);
}
}
输出为150。
但是当我写这样的代码时:
public class test {
public static void main(String[] args){
System.out.println('a'+'b'+'c'+"");
}
}
输出变为294。
我想知道为什么。
答案 0 :(得分:7)
您可以验证a,b和c(或任何其他字符)的值here。
编辑:要解释为什么最后一个输出正确的值而不是抛出错误,首先按照前面的说明对所有值求和,然后将其转换为字符串,将“”添加到总和中字符的ASCII值。但是,println方法需要一个String,这就是它不会抛出任何错误的原因。
如果你做Integer.parseInt('1' + '2' + '3' + "");
答案 1 :(得分:2)
当你这样做时
int i = '1' + '2' + '3';
JVM对给定数字的ASCII码求和。结果 150 。
当您添加空String
时,您尝试将int
/ char
与String
相加。这是不可能的。您可以将char
隐式转换为int
,反之亦然,因为它们是原始类型。您无法对String
个对象执行此操作,因为它们不是基元而是引用。这就是你收到错误的原因。
当您执行println
时,首先将原始值相加并将自动装箱转换为引用类型,以便将总和框装入Character
对象。空String
转换为Character
,然后添加到第一个Character
。因此结果是toString
对象具有ASCII码294.然后调用Character
的{{1}}方法,因为这是println(Object)
方法的作用。结果是 294
我希望这能帮助您了解正在发生的事情:)
答案 2 :(得分:0)
第一个是不可能的,因为您无法通过这种方式将String
转换为int
。
第二个有用,因为char
是一种数字,所以添加char
s就是添加它们真正的数字。 Char '1'
是数字49(参见ASCII表),因此总和为49 + 50 + 51,即150。
第三种方式是这样的,因为+
是一个左括号运算符,这意味着'a'+'b'+'c'+""
应该被读作(('a'+'b')+'c')+""
。 'a'
具有ASCII码97,因此您拥有294+""
。然后Java知道应该将值转换为String
以便能够连接两个字符串。最后你有字符串294
。将您的上一个代码修改为以下System.out.println('a'+'b'+('c'+""));
,您会看到结果为195c
。
您必须注意System.out.println
是一种用于将值(不同类型)转换为String
表示的方法。这总是可行的,因为每个int
都可以转换为它的String
表示,但不是相反的;不是每个String
都是int
的表示(因此Java不会让你这么简单)。
答案 3 :(得分:0)
首先:[int i =' 1' +' 2' +' 3' +"";] 如果连接空字符串值,则将其转换为String对象,然后String对象不能转换为int。
第二:[int i =' 1' +' 2' +' 3';] char上的二进制算术运算提升为int。它等于: [int i = 49 + 50 + 51] - 总数:150。
第三:[System.out.println('' +'' +' c' +"");] 在这种情况下,您可以转换' a' +' b' +' c' (即294)到String(+"")然后打印结果就像一个字符串值,并且工作正常。