为什么整数与数字串联会产生字符串?

时间:2013-05-06 22:59:24

标签: java casting

我正在进行AP Comp Sci练习测试并发现以下问题:

输出是什么:

System.out.println("1" + new Integer(2) + 3);

答案是

123,

我很困惑,因为new Integer(2)没有被转换成字符串,因此如果两个部分都是整数,为什么java编译器认为new Integer(2) + 3语句是字符串连接?

4 个答案:

答案 0 :(得分:9)

添加是关联的。 a + b + c ==(a + b)+ c

答案 1 :(得分:1)

答案是否与操作顺序一样简单,这意味着语句从左到右进行评估,以便可以读取。 System.out.println(“1”+ new Integer(2).toString()+ 3.toString());

答案 2 :(得分:0)

首先,正如小伙子指出的那样,加法是左联想的。

其次,“1”+ 2的重载分辨率由左操作数控制,该操作数是一个字符串。这迫使连接,结果是“12”。

现在,“12”+ 3经历完全相同的重载分辨率,你得到“123”。

答案 3 :(得分:0)

最初的问题是:

System.out.println("1" + new Integer(2) + 3);

为什么给我们“ 123”;我认为发问者的意思不是6或“ 15”?

让我们简化一下并将新的Integer位删除为等效的值:

System.out.println("1" + 2 + 3);

Java语言规范12给出了答案(4.2.2):

  

字符串连接运算符+(第15.18.1节),在给定String的情况下   操作数和整数操作数,会将整数操作数转换为String   (字节,短,整数或长操作数的十进制形式,或字符   一个char操作数),然后产生一个新创建的String   两个字符串的串联。 https://docs.oracle.com/javase/specs/

15.18.1节更加清楚:

  

加法运算符具有相同的优先级,并且在语法上为左联想   (他们从左到右分组)。   如果+运算符的任何一个操作数的类型为String,则该操作为string   级联。 https://docs.oracle.com/javase/specs/

因此,由于在两种情况下都使用了运算符+,所以它按从左到右的顺序评估是连接还是加法,如15.18.1中所述和其他答复者所述。第一个操作数“ 1”是一个字符串,第二个操作数是一个整数2,因此根据上述规则,整数2被转换为字符串“ 2”,而加号则被解释为连接,从而得到了字符串“ 12”。然后它有一个字符串“ 12”和一个整数3,因此整数3根据上述规则转换,并且+再次被解释为串联,我们得到了字符串“ 123”。

如果他们在2 + 3前后加上括号,那么

System.out.println("1" + (2 + 3));

很显然,这将迫使2 + 3首先被评估。它们都是整数,所以您得到一个整数5。然后我们将得到“ 1” + 5,这是一个字符串加上一个整数,因此该整数将转换为字符串“ 5”,并将它们连接在一起,得出“ 15”

如果他们改变了这样的顺序:

System.out.println(2 + 3 + "1");

然后,将按照从左到右的规则首先完成2 + 3,并且由于它们都是整数,所以+表示加法,并且将产生整数5。然后我们将使运算符成为整数5和字符串“ 1”。根据上述规则,将整数5转换为字符串5,将+解释为串联,我们得到字符串“ 51”。

因此,所有这些都归结为操作的顺序,所有这些操作实际上都是二进制的(一次只需要执行两次),并且在使用加号时,如果一个操作数是字符串,则另一个如果不是,则将其更改为字符串,加号解释为串联,结果是字符串。