2014-12-27 20 views
-1

我有一个理解Java中堆栈内存功能的问题。 根据我的老师,以下方法会在堆栈内存中创建2个基本类型局部变量。为什么我可以访问堆栈中的非“最后进入”变量?

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

由于槽定义stackmemory是“后进先出”我不明白这应该如何工作。 我可以访问“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)! 
    } 

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

+3

此“堆栈”不适用于在同一方法中声明的变量 - 它们全部位于相同的*堆栈帧*中。如果从'test'调用另一个方法:这是另一个栈帧被压入堆栈的地方。 – laune

+1

http://stackoverflow.com/questions/19433523/where-is-thread-object-created-stack-or-heap - 这个线程会给你很好的理解执行模型 – user1428716

+2

你混淆了你的堆栈,开发者,推送和弹出值,以及由JVM管理的调用堆栈。如果你看看生成的字节码,你可能会有更好的理解。 –

回答

0

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

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

把它想象成一块记忆可能更容易。当方法A()调用方法B()时,A的框架被存储(在一个真正的堆栈状结构上)并为B创建一个新框架。当B返回时,A的框架被恢复 - 这就是典型的堆栈LIFO行为出现的地方

1

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

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

相关问题