在Java中,循环语句中的变量声明是如何工作的?

3
public class Test1{
    public static void main(String[] args){
        int x = 3;
        do {
            int y = 1;
            System.out.print(y++ + " ");
            x--;
        } while(x >= 0);
    }
}

在上面的代码中,局部变量 y 在 do while 语句块的范围内。这对于循环的所有迭代都是有效的。那么为什么 Java 在第一次迭代后不会抛出“变量 Y 已经定义”的错误,因为我们在每次迭代中重新声明了相同的变量?

5
每次迭代都会产生一个新的变量。 - Jon Skeet
“这适用于循环的所有迭代。” - 实际上并不是。变量 y 的值不能在一个循环迭代到下一个迭代中保持不变。(还有Jon所说的。) - Stephen C
@Jon Skeet,在这种情况下,Java是否会隐式地将变量的值从旧迭代复制到新迭代?否则,在每次迭代中,局部定义的变量将从它们的默认值开始。 - Mayank Madhav
1
不,每个变量在逻辑上都是一个“新”的变量。 - Jon Skeet
@MayankMadhav,即使它按照您提出的思路执行操作,也无法观察到此操作,因为您必须先声明变量才能访问其值。 - M. Prokhorov
同意 @M.Prokhorov。我当时在考虑for循环。这可能有点不同。如果我们在for循环的初始化部分声明一个变量,那么即使每次循环进入下一次迭代,该变量也会保持可用状态。同时,我要感谢Job Skeet和Stephen C的快速回答。 - Mayank Madhav
4个回答

1
变量x在循环的所有迭代中都在作用域内,变量y在每次循环迭代中都是单独的作用域。当执行超出{ }大括号时,y就会失去作用域(并消失)。因此,在评估while(x >= 0)时,y不在作用域内。您可以通过尝试在条件中使用y来测试它,您将看到一个错误,告诉您没有声明y变量。

1
当我们在每次迭代中重新声明同一个变量时,为什么Java不会在后续的迭代中抛出错误"变量Y已经定义"呢?
每次迭代结束后,变量y就会被销毁,并且在下一次迭代中重新声明一个新的y。
所以如果你迭代3次,每次都会重新声明一个新的y,并且总共有3个y被销毁。
       do {
            int y = 1; // created
            System.out.print(y++ + " ");
            x--;
           // going to die here as the scope of the block ending here
      } while(x >= 0);

1
如果您展开循环,您的代码基本上看起来像这样:
{
    int y=1; 
    System.out.print(y++ + " ");
}
{
    int y=1; 
    System.out.print(y++ + " ");
}
{
    int y=1; 
    System.out.print(y++ + " ");
}
{
    int y=1; 
    System.out.print(y++ + " ");
}

每个y都有自己的范围,即它们只存在于其封闭的大括号内。因此,将创建四个不同的变量,并应该打印1 1 1 1


0
在每次循环迭代中,您都会重新声明变量y并将其实例化为值1。循环不会在后续的变量y状态上产生影响,因为变量y每次都在循环开始时被声明。因此,它会忽略先前的状态,并在每次循环迭代中重新开始,即y=1。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接