for循环的条件部分中的final关键字

Posted

技术标签:

【中文标题】for循环的条件部分中的final关键字【英文标题】:final keyword in condition section of for loop 【发布时间】:2017-04-20 20:21:41 【问题描述】:

A.

    int a=10,b=20;
    for(int i=0;a>b;i++)
    
      System.out.print("aa");
    
    System.out.print("bb");

B.

    final int a=10,b=20;
    for(int i=0;a>b;i++)
     
      System.out.print("aa");
     
    System.out.print("bb");

问。为什么代码 A 打印输出“bb”而代码 B 返回错误“无法访问代码”?

【问题讨论】:

最终变量在运行时永远不能改变,但普通变量可以。所以在 A 有可能到达 for 循环的内部,但在 B 它永远不可能 澄清一下,在 A 中,如果中间有一些额外的代码,它理论上可以进入循环。换句话说,除非很明显,否则编译器不会尝试猜测流程。 @XtremeBaumer A 和 B 最终变量都没有改变。 【参考方案1】:
final int a=10,b=20;

表示变量在编译后永远不会改变它的值

因此这个for循环

for(int i=0;a>b;i++)

有一个永不中断的条件(a>b 永远不会为真),因此循环是永远的,这变成了

System.out.print("bb");

“无法访问的代码”

【讨论】:

【参考方案2】:

在部分 A 代码可以如下更改并打印两个输出。请注意,在循环上执行时,可以更改 a 和 b 上的值。输出将是 aabb

    int a=10,b=20;
    for(a=30;a>b;)
    
      System.out.print("aa");
      a=a-20;
    
    System.out.print("bb");

在关于运行时的 B 部分中,无法更改 a 或 b 的值,因为它们是最终变量。由于这个原因,JVM 可以识别出 a>b 条件不可能为真。 (因为 a>b 总是假的)。

所以 JVM 会抛出编译错误说 Unreachable code。

【讨论】:

【参考方案3】:

final 关键字表示 a 和 b 的值不能改变,即它们是值而不是变量,因此 for 循环永远不会执行内部语句,因此编译器推断 for 循环内部的代码是不可达的。

【讨论】:

在代码 B 中,试试这个:final int a=10,b=20; a = 25;这将产生编译错误。所以这意味着 a 和 b 是不可变的。【参考方案4】:

B 返回错误“无法访问的代码”

for(int i=0;a>b;i++) //with final modifier, `a` & `b` are constants

编译器如何使用 final 修饰符查看您的代码,这是编译器抱怨的原因

for(int i=0;10>20;i++)

10 总是小于 20,所以你的循环体在 unreachable code

【讨论】:

以上是关于for循环的条件部分中的final关键字的主要内容,如果未能解决你的问题,请参考以下文章

for循环变量声明为 final

《JAVA学习笔记 (final关键字)》

Java学习笔记(二十三):final关键字

部分关键字--this/extends/super/static/final/abstract/访问权限总结

面向对象之final关键字

一脚踩进java之基础篇19——面向对象 (final,static关键字)