为什么我可以在堆栈中访问非“last in”变量?

时间:2014-12-27 12:22:36

标签: java jvm stack

我在理解Java中堆栈内存的功能时遇到了问题。 根据我的老师的说法,以下方法将在堆栈内存中创建2个基本类型的局部变量。

  private void test()
    {
        int x = 0;      //created in stack
        int y = 1;      //created in stack
    }

as trough定义stackmemory是" last in,first out"我不明白这应该如何运作。 我可以访问" x"这肯定不是变量,这是"最后的"在堆栈内存。

private void test()
    {
        int x = 0;      //created in stack
        int y = 1;      //created in stack

        x = 15;         //x is not last in (y is last in)!
    }

有人可以解释我,我在想什么?

2 个答案:

答案 0 :(得分:1)

变量声明顺序与堆栈内存无关。执行方法变量(x和y)将驻留在一个堆栈帧中,它将位于堆栈的顶部。

如果此方法调用另一个方法,则将创建一个新的堆栈帧,它将位于堆栈的顶部。该方法完成后,将删除相应的堆栈帧。在此方法完成执行之前,我们无法访问调用方法变量。这是使用堆栈的LIFO排序的地方。

答案 1 :(得分:0)

此实例中的堆栈表示当前正在执行的方法可访问的一块内存 - 更准确地称为堆栈帧。每个被调用的方法都有自己的Stack Frame来存储本地数据。

方法中的所有局部变量都属于此堆栈帧,但帧的行为不限于Last-In,First-Out - 帧中的任何区域都可以读取或写入,这就是为什么可以访问变量的原因以任何顺序。

将它视为一大块记忆可能更容易。当方法A()调用方法B()时,A的帧被存储(在真正的类似堆栈的结构上)和为B创建的新帧。当B返回时,A的帧被恢复 - 这就是典型的堆栈LIFO行为进入的地方