[英]Why java final variable showing unreachable Statement
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
使这些变量final
也使它们成为常数变量。 这意味着编译器可以使用它们初始化的值替换变量的使用。
因此,编译器尝试生成以下内容
while (10 < 20)
这相当于
while (true)
这将使它成为一个无限循环,并且块之后的代码将变得无法访问。
这是在Java语言规范中规定的, 在这里
如果至少满足下列条件之一,则while语句可以正常完成:
while语句是可访问的,条件表达式不是值为true的常量表达式(第15.28节)。
有一个可到达的break语句退出while语句。
这些都不满意,因此while
语句无法正常完成。 之后的一切都无法到达。
它显示无法到达的原因,因为x
和y
都被声明为final
,它们无法改变(它们是常量),因此while将始终循环,并且永远不会达到“Hi”打印
Java知道无法更改最终变量。 你已经声明x,y
都是最终的。 因此它知道循环不能终止,因为x < y
总是为真。
这是因为在您的示例中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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.