编译时间常量在 java 中如何在内部工作

How compile time constant will work internally in java

我的问题是编译时间常量在内部是如何工作的,所以我们在 Below 语句中没有遇到错误。

final int a = 10;
byte b = a;

为什么我在这个语句中出现错误。

int a = 10;
byte b = a;

这是因为并非所有整数都适合一个字节。

在您的第一个示例中,a 的值是已知的,无法更改。编译器知道它适合一个字节。

在你的第二个例子中,因为 a 不是最终的,它可能已经被改变了(虽然不是在你的例子中)。 Java 编译器不够聪明,无法注意到它没有发生任何变化,因此不再确定它是否适合一个字节。

举个例子,看看这个:

    final int a = 10000;
    byte b = a;

因为 a 的值现在太大而不能放入一个 int 中,它不再编译。

在下面的情况下,当您的 int 值不是 final 时,您必须将 int 转换为 byte,同时将整数值分配给 byte在 java.

int a=11;
byte b= (byte) a;

1.For 一个二元运算符('=' 或 '+'...),编译器使用数字提升系统。这会在执行操作之前将 "primitive type" 提升为低于 "int" 的 byte char 和 short 为 "int"。

2.然后byte, char, short,接受一个常量并且适合它们类型大小的int值。

所以下面将编译:

    final int int1 = 10;
    byte byt1 = int1; /* int to byte and when compiling to bytecode byt1 is assigned 10 and not a variable int1 as it's a final constant.*/

这将无法编译:

    byte byt1 = 2;
    byte byt2 = +byt1; /* int to byte but when compiling to bytecode byt1 is not assigned 2 as byt1 value might change at run time to a value larger than what byte can support so you get compiler error.*/

这不会编译:

    final long lng1 = 10;
    byte byt2 = lng1; /* long type to byte. remember byte, char and short only accept int.*/