class Example{
public static void main(String args[]){
final int x=127;
final int y;
y=100;
byte b;
b=x;
b=y;
}
}
考虑这个程序 x 和 y 变量声明为最终变量。所以我需要将 x 和 y 值分配给 b。b=x; 编译和 b=y; 没有编译。为什么此代码无法正常工作。请需要解释。
我没有真正的线索你想通过这段代码实现什么,但我可能会尝试解释为什么它适用x
于y
. 我可能拼错了严格的命名法,但它是这样的。
一个(也可能是主要的)原因是因为编译器如何分析源代码。
Final 关键字仅意味着一旦分配/初始化该值就无法更改(并且必须在访问该值之前对其进行初始化)。
该b=x;
分配工作,因为确切的最终值x
变量是在编译时已知的和的值x
是127,其是在字节类型的范围。因此它可以分配给b
-x
不会改变,因为它是最终的并且它的值在字节范围内并且在编译时是已知的。
超出x
变量的字节范围(例如 128)会产生相同的错误。
该b=y;
不会,因为,虽然看起来很怪异,终值y
变量在编译时不知道。编译器并没有遵循所有的指令来评估变量的值。因此,编译器不知道在 的初始化和声明之间y
是否有其他指令可能会更改分配给 的值y
。换句话说,分配给的值y
是在运行时评估的——因为它是另一条指令。
看到的错误b=y
是:
error: incompatible types: possible lossy conversion from int to byte
尝试执行以下操作时会产生相同的错误:
int z = 126;
final int zz=z;
b=zz;
或类似的东西:
final int zz=new Scanner(System.in).nextInt();
b=zz;
在我zz
和你的y
情况下,这些变量的最终值是在运行时评估的,编译器不知道它们的值是否不会溢出b
字节范围。
编译器不是很聪明的东西,或者......是,但没有进行广泛的优化和检查。要求编译器知道这y=100
会使编译时间变得更长(因为它还需要评估zz=new Scanner...
表达式)。
它也适用于以下内容:
final int x=127*2/2;
b=x;
因为x
可以在编译时评估的确切值。
如果您需要一些规范页面,请告诉我,我可以稍后再查找。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句