我正在进行AP Comp Sci练习测试并发现以下问题:
输出是什么:
System.out.println("1" + new Integer(2) + 3);
答案是
123,
我很困惑,因为new Integer(2)
没有被转换成字符串,因此如果两个部分都是整数,为什么java编译器认为new Integer(2) + 3
语句是字符串连接?
答案 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”。
因此,所有这些都归结为操作的顺序,所有这些操作实际上都是二进制的(一次只需要执行两次),并且在使用加号时,如果一个操作数是字符串,则另一个如果不是,则将其更改为字符串,加号解释为串联,结果是字符串。