编译时常量在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代码>是合法的。在某些上下文中,编译器可以确定值是否在字节的有效范围内。常数就是这样一个常数。