为什么java final变量显示无法访问的Statement

时间:2014-06-12 03:32:20

标签: java variables local final

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无限时间

但是当我使局部变量fi​​nal int x = 10时,y = 20; 然后它显示Statement Unreachable

4 个答案:

答案 0 :(得分:9)

使这些变量final也使它们成为常量变量。这意味着编译器可以使用它们初始化的值替换变量的使用。

因此,编译器尝试生成以下

while (10 < 20)

这相当于

while (true)

这将使它成为无限循环,并且块之后的代码将变得无法访问。

这在Java语言规范here

中指定
  

while语句可以正常完成iff至少其中一个   以下是真的:

     
      
  • 可以访问while语句,条件表达式不是值为true的常量表达式(第15.28节)。

  •   
  • 有一个可到达的break语句退出while语句。

  •   

这些都不满意,因此while语句无法正常完成。之后的一切都无法到达。

答案 1 :(得分:0)

由于xy都被声明为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