Java 为什么我可以访问非";“最后一个”-堆栈中的变量?

Java 为什么我可以访问非";“最后一个”-堆栈中的变量?,java,jvm,stack,Java,Jvm,Stack,我在理解Java中堆栈内存的功能时遇到了一个问题。 根据我的老师的说法,下面的方法将在堆栈内存中创建两个基本类型的局部变量 private void test() { int x = 0; //created in stack int y = 1; //created in stack } private void test() { int x = 0; //created in stac

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

  private void test()
    {
        int x = 0;      //created in stack
        int y = 1;      //created in stack
    }
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)!
    }
由于stackmemory是“后进先出”的定义,我不明白它应该如何工作。 我可以访问“x”,它肯定不是变量,它是堆栈内存中的“最后一个”

  private void test()
    {
        int x = 0;      //created in stack
        int y = 1;      //created in stack
    }
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)!
    }

有人能解释一下,我错在想什么吗?

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


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

此实例中的堆栈表示当前执行的方法可以访问的内存块,更准确地说是堆栈帧。每个被调用的方法都有自己的堆栈帧,用于存储本地数据

方法中的所有局部变量都属于此堆栈框架,但框架的行为不限于后进先出-框架内的任何区域都可以读取或写入,这就是为什么可以按任何顺序访问变量的原因


把它看作一块内存可能更容易。当方法A()调用方法B()时,A的帧被存储(在一个真正的堆栈式结构上)并为B创建一个新帧。当B返回时,A的帧被还原-这就是典型的堆栈后进先出行为的原因。

此“堆栈”不适用于在同一方法中声明的变量-它们都在同一堆栈帧中。如果从
test
调用另一个方法:这是在堆栈上推送另一个堆栈帧的位置。-这个线程将很好地理解执行模型。如果您将一个堆栈(您,开发人员,push和pop值所在的堆栈)与调用堆栈(由JVM管理)混淆了,那么调用堆栈将由JVM管理。如果查看生成的字节码,您可能会有更好的理解。每当调用方法时,堆栈帧都会被推到堆栈上(=堆栈指针处于高级状态),同时分配所有变量(和参数)。当控件从方法返回时,帧被删除(=堆栈指针减少)。-如果抛出异常并将其传播到某个更高的调用级别,则堆栈也会“展开”。前者利用后者。