class Foo{
public static void main(String args[]){
final int x=101;
int y;
if(x>100){
y=-1;
}
System.out.println(y);
}
}
Java编译器理解if语句的条件始终为true,因此y将始终被初始化。没有编译错误,如预期的那样。
class Bar{
public static void main(String args[]){
final int x;
x=101;
int y;
if(x>100){
y=-1;
}
System.out.println(y);
}
}
但是,当我将x的声明和初始化分为两行时,编译器似乎没有得到条件始终为true且y将始终被初始化的信息。
final int x;
x=101;
byte b;
b=x;
System.out.println(b);
同样的事情在这里发生,并且编译器给出了精度误差的损失。
final int x=101;
byte b;
b=x;
System.out.println(b);
同样,编译器可以理解x在b的范围内。
最佳答案
它与编译器如何确定是否执行语句有关。它在JLS #16中定义:
在您的情况下,编译器无法确定y
已明确分配,并给您带来错误。这是因为它将需要确定条件始终为真,并且仅当if
中的条件为常量表达式时才有可能。
JLS #15.28定义常量表达式:
JLS #4.12.4将常量变量定义为:
在您的情况下,final int x = 101;
是一个常量变量,而final int x; x = 101;
不是。