编译时间常量在 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.*/
我的问题是编译时间常量在内部是如何工作的,所以我们在 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.*/