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

编译时常量在java内部如何工作,java,int,byte,final,Java,Int,Byte,Final,我的问题是编译时常量是如何在内部工作的,这样我们就不会在下面的语句中出错 final int a = 10; byte b = a; int a = 10; byte b = a; 为什么我在这句话中会出错呢 final int a = 10; byte b = a; int a = 10; byte b = a; 这是因为并非所有整数都能放入一个字节 在第一个示例中,a的值是已知的,不能更改。编译器知道它将适合一个字节 在第二个示例中,因为a不是最终的,所以它可能已经被更改了(尽管在您

我的问题是编译时常量是如何在内部工作的,这样我们就不会在下面的语句中出错

final int a = 10;
byte b = a;
int a = 10;
byte b = a;
为什么我在这句话中会出错呢

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
转换为
字节,同时在java中为
字节
指定一个整数值

int a=11;
byte b= (byte) a;
1.对于二进制运算符(“=”或“+”…),编译器使用数字提升系统。这会在执行操作之前提升一个低于“int”的“基元类型”,比如byte char,并将其缩短为“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.*/

相同原因
字节b=10是合法的。在某些上下文中,编译器可以确定值是否在
字节的有效范围内。常数就是这样一个常数。