当前位置: 首页 > 面试题库 >

在Java循环中重新声明变量

翟缪文
2023-03-14
问题内容

在Java中,我们不能与另一个具有相同名称的变量在同一作用域中声明一个变量:

int someInteger = 3;

...

int someInteger = 13;

语法错误,无法编译。但是,如果我们将其放入循环中:

for (int i = 0; i < 10; i++) {
   int someInteger = 3;
}

不产生错误,效果很好。我们基本上是在声明相同的变量。是什么原因?在此背后我不知道/不了解的逻辑是什么?


问题答案:

考虑一下这种方式,在每个循环之后,作用域被“破坏”,变量消失了。在下一个循环中,将创建一个新的作用域,并且可以在该作用域中再次声明该变量。

由于类似的原因,您也可以这样做

{
   int someInteger = 3;
}
{
   int someInteger = 13;
}

顺便说一句,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


 类似资料:
  • 问题内容: 在循环内部声明变量是否不好?在我看来,这样做,如下面的第一个代码块所示,将使用第二次的十倍的内存…由于在循环的每次迭代中都创建了一个新的字符串。这样对吗? 与 问题答案: 在循环内部声明变量是否不好? 一点也不!它将变量本地化到其使用点。 在我看来,如下面的第一个代码块所示,这样做将使用十倍于第二个内存的内存。 编译器可以优化内容以保持内存使用效率。仅供参考:如果您使用关键字告诉您变量

  • 问题内容: 为什么以下工作正常? 但是据说这是危险的/不正确的: 是否需要在循环外声明变量? 问题答案: 局部变量的范围应始终尽可能小。 在你的例子我相信是不会使用的外while循环,否则你就不会问这个问题,因为它声明的内部while循环不会是一个选项,因为它不会编译。 所以,既然是不使用外循环,在尽可能小的范围是内 while循环。 所以,答案是着重那绝对应该被while循环内声明。没有,没有,

  • 问题内容: 我被困在我应该声明一个称为“ phrase”的字符串变量的部分,该变量不应一直循环播放。 让您知道我的任务是:与选项1相似,不同之处在于用户在输入第一队的结果后输入“ N”(而不是“ Q”)。然后,程序输入第二个团队名称及其结果,直到输入“ Q”。输出两个语句,例如选项1中的语句,然后输出第三条语句,该语句说明哪个团队处于第一位(基于点数) 输入样例: 样本输出: 更新 : 我的代码:

  • 问题内容: 我一直想知道,一般而言,在循环之前声明一个扔掉的变量(而不是在循环内部重复)是否会产生(性能)差异?Java中的一个例子(毫无意义): a)循环前声明: b)循环内的声明(反复): a或b哪个更好? 我怀疑重复变量声明(示例b)在理论上会产生更多开销,但是编译器足够聪明,因此无关紧要。示例b的优点是更紧凑,并将变量的范围限制在使用它的地方。尽管如此,我还是倾向于根据示例a进行编码。 问

  • 我如何通过for循环的每次迭代声明一个新变量? 例如: 循环完成后,我想要4个变量,分别名为、、和,每个变量分别设置为、、和(当我在上面的代码中将设置为时,我实际上是将其设置为,因为这是在整个特定迭代中的值

  • 问题内容: 如何在简短的变量声明中从其他块中重新声明变量? 关于此问题有很长的话题,但现在我很感兴趣如何解决此问题。 问题答案: 简短的变量声明的Go规范很明确: 短变量声明可以重新声明变量,只要它们最初是在同一块中以相同类型声明的,并且至少一个非空变量是新变量。 因此,在简短的变量声明中,您无法重新声明最初在其他块中声明的变量。 这是一个如何通过在内部块中声明局部变量()并将其()分配给在外部块