问题说明了一切,这是代码:
public class Chars
{
public static void main(String[] args){
Chars c = new Chars();
String res = c.test("abcd");
System.out.println(res);
}
public String test(String str){
String res = "";
res += str.charAt(0) + str.charAt(2);
return res;
}
}
返回:“196”,它是a
和c
的ASCII值的总和!
为什么会这样? ,我希望得到“交流”。
如果我修改test()方法中的第二行,如下所示:
res = res + str.charAt(0)+str.charAt(2);
结果确实是“ac”。 请有人帮我解决这个疑问。我无法找到并回答!
答案 0 :(得分:0)
这是因为charAt()
返回char值而不是String。因此+
运算符不代表连接,但它只是两个数字的简单相加。
如果+
的两个操作数都是数字,则此方法有效。如果其中一个是String
,+
不再执行添加,但两个操作数都转换为String
,而是执行连接。因此,如果您在混合中包含res
,则
res + str.charAt(0)
将是String
并使用相同的逻辑,整个事情
res += str.charAt(0) + str.charAt(2);
也将评估为String
。
答案 1 :(得分:0)
区别在于连接的构建方式。
首先:res += str.charAt(0) + str.charAt(2);
此处,首先将两个char
值相加。发生二进制数字促销(JLS, Section 5.6.2)。
应用扩展基元转换(第5.1.2节)来转换以下规则指定的一个或两个操作数:
如果任一操作数的类型为double,则另一个操作数转换为double。
否则,如果任一操作数的类型为float,则另一个操作数转换为float。
否则,如果任一操作数的类型为long,则另一个操作数转换为long。
否则,两个操作数都将转换为int类型。
这意味着价值会提升为int
,从而创建196
。然后将其添加到str
,附加"196"
。
第二:res = res + str.charAt(0) + str.charAt(2);
此处,res + str.charAt(0)
首先执行,String
加char
追加char
(通过String Conversion, JLS 15.18.1,从而产生新的{{} 1}}。
如果只有一个操作数表达式是String类型,则在另一个操作数上执行字符串转换(第5.1.11节)以在运行时生成字符串。
然后,类似地附加第二个String
。
如果你要说
char
然后结果与res = res + (str.charAt(0) + str.charAt(2));
一样(附加196
)。
答案 2 :(得分:0)
字符不是字符串。你会期望得到" ac"如果" a"和" c"是弦乐。字符是表示字符的无符号整数,如果添加任何两个字符,结果将转换为int。如果要将其视为char或将其分配给声明为(char)
的变量,则必须使用char
进行强制转换。
答案 3 :(得分:0)
JLS §15.18.1. String Concatenation Operator +解释了原因:
如果只有一个操作数表达式是
String
类型,则在另一个操作数上执行字符串转换(第5.1.11节)以在运行时生成字符串。
在您的情况下,您正在执行:char + char
。非操作数的类型为String,因此执行经典的数字加法。
答案 4 :(得分:0)
一般情况下,如果您想从字符串中提取字符并获得长度为1的String
而不是char
,则代替:
str.charAt(i)
你可以这样做:
str.substring(i, i+1)
或者这个:
Character.toString(str.charAt(i))
或:
("" + str.charAt(i))