java - 每次循环都创建一个新变量吗?

标签 java

在下面的例子中:

for(int i=0; i<10; i++) {
  int k;
}
  1. 循环体(即“int k”语句)是否会重复执行10次?

  2. 如果是这样,是否意味着每次都会创建一个新变量 k? (因为这种“类型后跟变量名”的格式被定义为在JAVA中创建一个新变量,尽管变量名保持不变)

最佳答案

不,变量的内存存在于方法中,而不是在循环中。您只能在循环内访问 k 这一事实是由编译器完成的。

如果您要像这样更改代码:

public class X
{
    public static void main(final String[] argv)
    {
        for(int i = 0; i < 10; i++)
        {
           int k = i * 2;

           System.out.println(k);
        }
    }
}

然后运行 ​​javap -c X 来查看您将看到的字节码:

       0: iconst_0
       1: istore_1          // i = 0
       2: iload_1
       3: bipush        10
       5: if_icmpge     25  // i < 10
       8: iload_1  
       9: iconst_2
      10: imul
      11: istore_2          // k = i * 2 < this is the key (see below)
      12: getstatic     
      15: iload_2           // this gets k (see below)
      16: invokevirtual #3                  
      19: iinc          1, 1   // i++
      22: goto          2
      25: return

istore_2 将计算结果存储到堆栈的第二个位置。 iload_2 获取堆栈中第二个位置的值。 (可以看说明书的说明here)

栈是一直存在的,把它想象成一个数组,方法可以访问其中的某一部分。

关于java - 每次循环都创建一个新变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39094164/

相关文章:

java - JButton 在调整大小时以一种奇怪的方式复制自己

java - 从文本文件中提取单词

java - 以编程方式将 id 分配给 EditText

java - 如何通过代码将外部 .jar 添加到构建路径

java - 物体下落时如何施加重力?

java - C++ NDK 中的 "jobject"和 "jclass"有什么区别

java - 扩展SupportMapFragment - 如何实例化新 fragment ?

java - ArrayList 中的唯一项

java - 在圆圈内绘制文本的交叉区域

java - Android/google 无特定原因的 ANR 崩溃