意外的java charAt输出

1 java

代码是

String veggie = "eggplant";
int length = veggie.length();
char zeroeth = veggie.charAt(0);
char third = veggie.charAt(4);
String caps = veggie.toUpperCase();
System.out.println(veggie + " " + caps);
System.out.println(zeroeth + " " + third + " " + length);
System.out.println(zeroeth + third + length);
Run Code Online (Sandbox Code Playgroud)

输出如下:

eggplant EGGPLANT   
e 1 8   
217
Run Code Online (Sandbox Code Playgroud)

这对我来说没有意义.引用charAt输出数字而不是字符.我期待它输出字符.我做错了什么?

Jon*_*eet 5

第二行应该是:

e l 8
Run Code Online (Sandbox Code Playgroud)

(请注意,第二个值是小写的L,而不是1),这可能不会违反您的预期.third尽管它是字符串中的第五个字符,但您的变量却被混淆地调用了.

这只剩下第三行.表达式的类型

zeroeth + third + length
Run Code Online (Sandbox Code Playgroud)

int......你正在进行算术加法.没有String涉及隐式转换,所以相反,每个操作数都有二进制数字提升int.这是有效的:

System.out.println((int) zeroeth + (int) third + (int) length);
Run Code Online (Sandbox Code Playgroud)

它总结了涉及'e','l'和8(长度)的UTF-16代码单元.

如果您想要涉及字符串转换,那么您可以使用:

System.out.println(String.valueOf(zeroeth) + third + length);
Run Code Online (Sandbox Code Playgroud)

只有第一次添加需要是字符串连接...之后,它由于关联性而流动.(即x + y + z(x + y) + z;如果类型x + yString,则第二次添加也会成为字符串连接.)