class Temp
{
public static void main(String[] args)
{
int x=10,y=20;
while (x<y)
{
System.out.println("Hello");
}
System.out.println("Hi");
}
}
输出 它打印Hello无限时间
但是当我使局部变量final int x = 10时,y = 20; 然后它显示Statement Unreachable
答案 0 :(得分:9)
使这些变量final
也使它们成为常量变量。这意味着编译器可以使用它们初始化的值替换变量的使用。
因此,编译器尝试生成以下
while (10 < 20)
这相当于
while (true)
这将使它成为无限循环,并且块之后的代码将变得无法访问。
这在Java语言规范here
中指定while语句可以正常完成iff至少其中一个 以下是真的:
可以访问while语句,条件表达式不是值为true的常量表达式(第15.28节)。
有一个可到达的break语句退出while语句。
这些都不满意,因此while
语句无法正常完成。之后的一切都无法到达。
答案 1 :(得分:0)
由于x
和y
都被声明为final
,因此显示无法访问的原因,它们无法改变(它们是常量),因此while将始终循环,并且永远不会达到“Hi”打印
答案 2 :(得分:0)
Java知道无法更改最终变量。你已宣布x,y
都是最终的。因此,它知道循环无法终止,因为x < y
始终为真。
答案 3 :(得分:0)
这是因为在您的示例中,最终变量为initialized with a compile-time constant expression
。使它们成为常量变量,编译器知道它在运行时永远不会被更改。因此final int x =10, y=20
成为编译时已知的常量变量。
相当于:
while (10<20){
System.out.println("Hello");
}
System.out.println("Hi");
现在编译时评估表明在这种情况下语句System.out.println("Hi");
将无法访问。
在运行时可以更改non constant variables
的位置。所以没有编译时检查while条件。
更多参考:http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.4