【发布时间】:2011-11-21 04:34:57
【问题描述】:
在以下代码中:
public class Main
{
Emp globalEmp;
public void aMethod()
{
final int stackVar = 10;
globalEmp = new Emp()
{
public void doSomeThing()
{
System.out.println("stackVar :" + stackVar);
}
};
}
public static void main(String[] args)
{
Main m = new Main();
m.aMethod();
m.globalEmp.doSomeThing();
}
}
interface Emp{
public void doSomeThing();
}
据我所知,将执行以下操作:
Main m = new Main();:将创建 Main 类的新实例,globalEmp设置为 null。m.aMethod();:调用 aMethod 包括将其实例变量stackVar复制到堆栈中,然后创建 Emp 类的新实例并将其分配给globalEmp实例。当方法
aMethod结束时,局部变量stackVar会被压出栈。m.globalEmp.doSomeThing();:函数doSomeThing将在globalEmp变量指向的先前创建的对象上调用。由于这个函数doSomeThing正在访问一个本地变量stackVar,它应该不会从缓存中弹出,它应该会抛出一些错误说明。
那么,Java 运行时究竟是如何工作的?
EDIT:
由于运行时将创建最终局部变量的 浅 副本(根据下面的答案),为什么它也不允许访问非最终变量?
您能否提供一些关于该问题的链接(在规范或某些官方位置)?
【问题讨论】:
标签: java memory-management jvm inner-classes callstack