Java 为什么字符串联返回;int";总和

Java 为什么字符串联返回;int";总和,java,string,char,sum,Java,String,Char,Sum,问题说明了一切,以下是代码: 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 = "";

问题说明了一切,以下是代码:

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值之和! 为什么会这样,我希望得到“ac”。 如果我修改test()方法中的第二行,如下所示:

res = res + str.charAt(0)+str.charAt(2);
结果确实是“ac”。 请有人帮我解答这个疑问。我就是找不到答案

这是因为
charAt()
返回char值,而不是字符串。因此这里的
+
运算符并不代表串联,而是两个数字的简单相加

如果
+
的两个操作数都是一个数字,则此操作有效。如果其中一个是s
String
+
不再进行加法,但两个操作数都被强制转换为
String
,并执行串联。因此,如果将
res
包括在混合中,则

res + str.charAt(0)
将是一个
字符串
,使用相同的逻辑,整个过程

res += str.charAt(0) + str.charAt(2);

也将被计算为
字符串

不同之处在于串联的构造方式

第一:
res+=str.charAt(0)+str.charAt(2)

这里,首先将两个
char
值相加。发生二进制数字升级()

加宽基元转换(§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)
,一个
字符串加上一个
char
附加
char
(via),产生一个新的
字符串

如果只有一个操作数表达式为String类型,则在运行时对另一个操作数执行字符串转换(§5.1.11),以生成字符串

然后,类似地附加第二个
char

如果你说

res = res + (str.charAt(0) + str.charAt(2));

然后,结果将与
+=
的结果相同(添加
196
)。如果“a”和“c”是字符串,则会得到“ac”。字符是表示字符的无符号整数,如果添加任意两个字符,结果将转换为int。必须使用
(char)进行强制转换
如果要将其视为字符或将其分配给声明为
char
的变量,请解释原因:

如果只有一个操作数表达式的类型为
String
,则在运行时对另一个操作数执行字符串转换(§5.1.11),以生成字符串


在本例中,您正在执行:
char+char
。操作数的非类型为String,因此执行经典的数字加法。

通常,如果您希望从字符串中提取字符,并获得长度为1的
字符串,而不是
char
,则应:

str.charAt(i)
您可以这样做:

str.substring(i, i+1)
或者这个:

Character.toString(str.charAt(i))
或:


非常感谢您的回答,这是一个很好的解释。但是,在第一种情况下,我使用“+=”不应该表示“res+str.charAt(0)…”我的意思是什么时候加上“res”的当前值?我认为这就像先加上“res”的实际值一样然后添加其他操作数,但似乎情况正好相反。这是因为
+=
的优先级低于
+
,所以
+
首先出现。非常感谢您的解释,已经编程近2年了,仍然会感到困惑或忘记这些小事情:P@FraK联合联络小组说“E1 op=E2相当于E1=(T)((E1)op(E2))”[
T
E1
的类型,但这里不需要它)。注意,它在所有内容周围都放上了括号。因此
A+=B
相当于
A=(A)+(B)
而不是
A=A+B
("" + str.charAt(i))