Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 循环中局部变量的空间分配_Java_Loops_Variables - Fatal编程技术网

Java 循环中局部变量的空间分配

Java 循环中局部变量的空间分配,java,loops,variables,Java,Loops,Variables,(true或false)循环体中声明的局部变量的空间在循环体执行时分配,并在循环体完成时取消分配 这个问题的答案是错误的。但是为什么呢?该语句是错误的,因为没有分配和释放局部变量空间。它存在于堆栈上,并在输入方法时保留 要查看堆栈空间的使用情况,请编写一个小型测试程序,包括: public static void test() { { int a = 1; long b = 2; int c = 3; } {

(true或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
这显示了在不同代码块中声明的局部变量是如何重用插槽的。

是(按照二进制形式请求的答案)

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

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


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

因为局部变量空间没有被分配和释放。它存在于堆栈上,并在输入方法时保留。@Andreas这是否意味着如果我有一个
inti=1
在一个循环中,当下一次迭代到来时(它将被重新初始化为
1
),该
i
的内存将被重新使用?@Jai这是正确的。更好的是:
{int i=1;}{int j=5;}
将重用堆栈空间,因为
i
j
从不同时在作用域中,所以
i
j
可以使用相同的空间。@Andreas Wow谢谢。我又学到了新东西:)