为什么我在第3和第4个打印语句中返回整数而不是字符?

时间:2013-04-05 04:45:35

标签: java unicode

您能解释一下最近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

    }
}

3 个答案:

答案 0 :(得分:8)

这是因为Binary Numeric Promotion

  

当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示可转换为数字类型的值,以下规则依次使用扩展转换(第5.1.2节)进行转换必要时操作数:

     
      
  • 如果任何操作数是引用类型,则执行拆箱转换(第5.1.8节)。然后:
  •   
  • 如果任一操作数的类型为double,则另一个操作数将转换为double。
  •   
  • 否则,如果任一操作数的类型为float,则另一个操作数转换为float。
  •   
  • 否则,如果任一操作数的类型为long,则另一个操作数将转换为long。
  •   
  • 否则,两个操作数都将转换为int类型。
  •   

基本上,两个操作数都转换为int,然后调用System.out.println(int foo)+*等可以返回的唯一类型是doublefloatlongint

答案 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 + charchar+int,并且因为没有后向赋值,所以在操作之后它仍然是int,因此调用整数方法。