在Java中重新声明循环内的变量

Hag*_*gra 9 java variables loops

在Java中,我们不能在具有相同名称的另一个变量的同一范围内声明变量:

int someInteger = 3;

...

int someInteger = 13;
Run Code Online (Sandbox Code Playgroud)

语法错误,不编译.但是,如果我们把它放在一个循环中:

for (int i = 0; i < 10; i++) {
   int someInteger = 3;
}
Run Code Online (Sandbox Code Playgroud)

生成没有错误,效果很好.我们基本上声明了相同的变量.是什么原因?在这背后我不了解/理解的逻辑是什么?

Zho*_*gYu 11

想一想,在每次循环之后,范围被"破坏",变量就消失了.在下一个循环中,将创建一个新范围,并且可以在该范围内再次声明该变量.

出于类似的原因,你也可以这样做

{
   int someInteger = 3;
}
{
   int someInteger = 13;
}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,Java不允许局部变量阴影,这可能不方便

int x = 3;
{
   int x = 13; // error!
}

Consumer<Integer> consumer = (x)->print(x);  // ERROR! 
// lambda parameter is treated like local variable

Runnable r = ()->{ int x; ... } // ERROR
// lambda body is treated like local block
Run Code Online (Sandbox Code Playgroud)