在循环中为局部变量分配空间

时间:2018-07-18 05:12:25

标签: java loops variables

  

(是或否)在执行循环主体时分配在循环主体中声明的局部变量的空间,并在主体结束时释放该局部变量。

这个问题的答案是错误的。但是为什么呢?

2 个答案:

答案 0 :(得分:6)

该语句为false,因为未分配和释放局部变量空间。它存在于堆栈中,并在输入方法时保留。

要查看如何使用堆栈空间,请使用以下代码编写一个小型测试程序:

public static void test() {
    {
        int a = 1;
        long b = 2;
        int c = 3;
    }
    {
        int x = 4;
        int y = 5;
        long z = 6;
    }
}

现在使用以下命令将其反汇编以查看字节码。

javap -c Test.class

这是输出。为了方便起见,我在右侧添加了Java代码。

  public static void test();
    Code:
       0: iconst_1                     int a = 1;
       1: istore_0
       2: ldc2_w     #22   long 2l     long b = 2;
       5: lstore_1
       6: iconst_3                     int c = 3;
       7: istore_3
       8: iconst_4                     int x = 4;
       9: istore_0
      10: iconst_5                     int y = 5;
      11: istore_1
      12: ldc2_w     #24   long 6l     long z = 6;
      15: lstore_2
      16: return                       return;

发生的事情是该方法保留了4个“插槽”。 int变量占用1个插槽,而long变量占用2个插槽。

所以代码确实说:

slot[0] = 1
slot[1-2] = 2L
slot[3] = 3

slot[0] = 4
slot[1] = 5
slot[2-3] = 6L

这显示了差异代码块中声明的局部变量如何重用插槽。

答案 1 :(得分:0)

是(按二进制格式要求回答)

局部变量存储在堆栈存储器中。当调用方法时,它是分配用于存储局部变量的临时内存。在Loop的情况下,局部变量的范围仅限于循环的开始和结束。 (例如,在while(...){-局部变量的范围-}的情况下)范围受{}大括号限制。

当在循环内部创建变量时,临时内存会分配到堆栈内存中,并且当变量的作用域结束时,它将可供重用。

注意:局部变量不会被垃圾收集。