Java 字符到字节转换

2022-09-01 23:22:35

我一直在测试字符转换,我经历了这个:

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
    }
}

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


答案 1

当变量为 时,编译器会自动内联其值为 1。此值可表示为 ,即:finalchar

c = b1;

等效于

c = 1;

实际上,根据关于最终变量的这一节,它被视为一个常量:b1

基元类型或类型的变量,即使用编译时常量表达式 (§15.28) 进行初始化,称为常量变量Stringfinal


答案 2

从 到 的转换是一种加宽和缩小的基元转换,如 Java 语言规范的第 5.1.4 段所述。bytechar

正如JLS所描述的,这是通过中间步骤完成的;通过加宽基元转换转换为,然后通过缩小基元转换转换为(参见 5.1.3)。byteintintchar

第5.2段解释了当您执行任务时何时需要强制转换:

...如果表达式是类型 、 、 或 的常量表达式§15.28):byteshortcharint

  • 如果变量的类型为 、 或 ,并且常量表达式的值在变量的类型中是可表示的,则可以使用缩小基元转换。byteshortchar

您的变量确实是常量,但您的变量不是常量,因此此规则适用于 但不适用于 。b1b2b1b2

所以:你可以赋值因为 是一个常量,而常量的值 , 适合于 一个 ,但是你不能在没有强制转换的情况下赋值,因为不是常量。b1cb11charb2cb2


推荐