在条件部分最终关键字for循环

问题描述:

A.在条件部分最终关键字for循环

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"); 

Q.为什么码A打印输出 “BB”,而代码B返回错误 “不可达代码” ?

+2

最终变量永远不能在运行时更改,但正常变量可以。所以在** A **有可能达到for循环的内部,但在** B **中它永远不可能 – XtremeBaumer

+0

为了澄清,在** A **中理论上*它可能会进入循环,如果之间有一些额外的代码。换句话说,编译器不会试图猜测流,除非它真的很明显。 – shmosel

+0

@ XtremeBaumer A和B的最终变量都没有改变。 –

final int a=10,b=20; 

装置后编译

因此这对于循环

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

具有从未断裂条件(A> B永远不会为真),因此循环变量永远不会改变它的值永远,这成为

System.out.print("bb"); 

“unreachab le code“

关于部分可以像下面那样更改代码并打印两个输出。请注意,在循环中执行时,可以更改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会抛出编译错误说无法访问的代码。

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

+0

代码B,试试这个:final int a = 10,b = 20; a = 25;这会导致编译错误。所以这意味着a和b是不可变的。 –

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

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

编译器是如何看待你的代码最终的修改,这就是编译器抱怨

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

10将永远少于20,所以你的博dy在unreachable code