您能解释一下最近2份印刷品中的内容吗?那就是我迷路的地方。
public class Something
{
public static void main(String[] args){
char whatever = '\u0041';
System.out.println( '\u0041'); //prints A as expected
System.out.println(++whatever); //prints B as expected
System.out.println('\u0041' + 1); //prints 66 I understand the unicode of 1 adds up the
//unicode representing 66 but why am I even returning an integer when in the previous statement I returned a char?
System.out.println('\u0041' + 'A'); //prints 130 I just wanted to show that adding an
//integer to the unicode in the previous print statement is not implicit casting because
//here I add a char which does not implicitly cast char on the returned value
}
}
答案 0 :(得分:8)
当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示可转换为数字类型的值,以下规则依次使用扩展转换(第5.1.2节)进行转换必要时操作数:
- 如果任何操作数是引用类型,则执行拆箱转换(第5.1.8节)。然后:
- 如果任一操作数的类型为double,则另一个操作数将转换为double。
- 否则,如果任一操作数的类型为float,则另一个操作数转换为float。
- 否则,如果任一操作数的类型为long,则另一个操作数将转换为long。
- 否则,两个操作数都将转换为int类型。
基本上,两个操作数都转换为int
,然后调用System.out.println(int foo)
。 +
,*
等可以返回的唯一类型是double
,float
,long
和int
答案 1 :(得分:2)
'\u0041' + 1
生成int
,您需要将其投放到char
,以便javac将调用绑定到println(char
)而不是prinln(int)
System.out.println((char)('\u0041' + 1));
答案 2 :(得分:0)
whatever
是一个字符,++whatever
表示whatever = whatever + 1
(忽略前缀顺序)
由于涉及赋值,因此将结果转换为char,因此调用char方法。但是在第3-4次打印中,没有赋值,并且根据规则,所有sum操作默认都在int中进行。所以在打印操作之前,它总结了char + char
和char+int
,并且因为没有后向赋值,所以在操作之后它仍然是int,因此调用整数方法。