java中的局部变量访问

java中的局部变量访问,java,memory-management,stack,Java,Memory Management,Stack,Java使用堆栈存储局部变量 那么,java如何访问局部变量呢。假设我想访问变量“b”,它会首先弹出“d”和“c”变量来访问它吗?如果不是,当程序员必须访问局部变量时,它是如何存储在堆栈和访问中的 public class Solution { public static void main(String args[]){ int a = 5; int b = 8; int c = 3; int d = c*3; System.out.prin

Java使用堆栈存储局部变量

那么,java如何访问局部变量呢。假设我想访问变量“b”,它会首先弹出“d”和“c”变量来访问它吗?如果不是,当程序员必须访问局部变量时,它是如何存储在堆栈和访问中的

public class Solution {  
 public static void main(String args[]){  
    int a = 5;
    int b = 8;
    int c = 3;
    int d = c*3;
    System.out.println("Testing c "+c);
    System.out.println("Testing b "+b);
    System.out.println("Testing d "+d);
 }
}
Java使用堆栈存储局部变量

这或多或少是不正确的

字节码形式的Java是堆栈和可访问变量的组合。是的,有一个堆栈,但也有一个小的变量存储系统,大多数局部变量最终都会出现在这个系统中;可以生成字节码将变量放入插槽,并从插槽加载变量,而无需先连续推送和弹出所有“在顶部”的内容

这里有一个简单的例子;以java代码为例:

公共静态无效测试(){
测试t=新测试();
系统输出打印项次(t.a+t.b);
}
课堂测试{
INTA,b;
}
转换为以下字节码:

meta: stack=3, locals=2    ; [1]
INVOKESPECIAL #9           ; [2] 'new Test() -> result on stack'
stack now: instance of Test
ASTORE_1                   ; Pop stack and put result in 'slot 1'
stack now: empty.
GETSTATIC #10              ; Read field 'System.out' -> result on stack.
stack now: Sysout
ALOAD_1                    ; Copy 'slot 1' onto stack.
stack now: instance of Test, Sysout.
GETFIELD #16               ; Consume top of stack, read a field, put that on stack.
stack now: int (t.a), Sysout.
ALOAD_1
stack now: instance of Test, t.a, Sysout.
GETFIELD #20
stack now: t.b, t.a, Sysout.
IADD                       ; this has no params, it's all stack based.
stack now: the sum of t.a+t.b, Sysout.
INVOKEVIRTUAL #23          ; the println method
stack now: empty (the invokevirtual consumed it all).
关于上述事项的说明:

[1] 在字节码中,堆栈将是有史以来最大的,我们需要的大多数“本地变量”都被跟踪。您可以通过javap看到这一点

[2] 有一个固定的池。常量池中的“索引”包含完整的方法引用(因此完全限定的类名+方法名+方法签名)是字节码的一部分,例如“调用此构造函数”、“读取此字段”等。javap输出中的#x标记是对该常量池的引用


对于您的代码片段,我邀请您做与我做的相同的事情:在一个非常简单的java文件中编写它,编译它,然后运行
javap-c-private MyClass
并查看一下

javap-c解决方案
将向您显示字节码。有一个JVM规范: