繁体   English   中英

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

[英]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无限次

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

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

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

while (10 < 20)

这相当于

while (true)

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

这是在Java语言规范中规定的, 在这里

如果至少满足下列条件之一,则while语句可以正常完成:

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

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

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

它显示无法到达的原因,因为xy都被声明为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM