Java char到字节转换

oue*_*lel 24 java scjp

我一直在测试char铸件,我经历了这个:

public class Test {
    public static void main(String a[]) {
        final byte b1 = 1;
        byte b2 = 1;
        char c = 2;

        c = b1; // 1- Working fine
        c = b2; // 2 -Compilation error
    }
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么当我在字节中添加最后一个时它在1中正常工作?

man*_*uti 19

当变量final为时,编译器会自动内联其值为1.此值可表示为a char,即:

c = b1;
Run Code Online (Sandbox Code Playgroud)

相当于

c = 1;
Run Code Online (Sandbox Code Playgroud)

实际上,根据本节关于final变量,b1被视为常量:

原始类型或类型的变量String,即final,用一个编译时间常量表达式(§15.28)初始化,被称为恒定变量.

  • @loonytune是编译器这样做.使用`javac 1.7.0_75`验证. (3认同)
  • 仍然应该没有区别 (2认同)

Jes*_*per 10

转换为byteto char是一种扩展和缩小的原语转换,如Java语言规范的第5.1.4节所述.

正如JLS所描述的那样,这是通过中间步骤完成的; 将byte被转换为int通过扩展原始转换,然后将int转换为char经由基本收缩转换(参见5.1.3).

第5.2段解释了在执行任务时何时需要演员:

...如果表达式是一个常量表达式(§15.28类型的)byte,short,char,或int:

  • 如果变量的类型是byte,, short或者char,则可以使用缩小的基元转换,并且常量表达式的值可以在变量的类型中表示.

你的变量b1确实是一个常量,但你的变量b2不是,所以这条规则适用b1但不适用b2.

所以:你可以赋值b1c因为b1是一个常量而常量的值1适合于a char,但是你不能在没有强制b2转换的c情况下赋值,因为b2它不是常量.