Java JVM堆栈中的局部变量表
今天我将一个类编译成字节码,在main方法局部变量表索引0中找不到任何内容,它是从1开始的,我知道一个非静态方法是从1开始的,因为它在0处是“this” 这是字节码Java JVM堆栈中的局部变量表,java,jvm,local-variables,Java,Jvm,Local Variables,今天我将一个类编译成字节码,在main方法局部变量表索引0中找不到任何内容,它是从1开始的,我知道一个非静态方法是从1开始的,因为它在0处是“this” 这是字节码 // this is the main method public static void main(java.lang.String[]); Code: 0: iconst_1 1: istore_1 // index: 1 (what is content at index 0 ?
// this is the main method
public static void main(java.lang.String[]);
Code:
0: iconst_1
1: istore_1 // index: 1 (what is content at index 0 ?)
2: iconst_2
3: istore_2
4: return
// this is a static method
public static void staticMethod();
Code:
0: iconst_1
1: istore_0 // index: 0 (no 'this')
2: iconst_2
3: istore_1
4: return
// this is a non-static method
public void nonStaticMethod();
Code:
0: iconst_1
1: istore_1 // index: 1 (index 0 should be 'this')
2: iconst_1
3: istore_2
4: return
请帮帮我,谢谢 主方法中索引0处的局部变量是该方法的参数:对字符串[]的引用。根据JVM规范: Java虚拟机使用局部变量在方法调用时传递参数。在类方法调用时,所有参数都以连续的局部变量的形式传递,从局部变量0开始
主方法中索引0处的局部变量是该方法的参数:对字符串[]的引用。根据JVM规范: Java虚拟机使用局部变量在方法调用时传递参数。在类方法调用时,所有参数都以连续的局部变量的形式传递,从局部变量0开始
哦,我明白了,非常感谢您的回答:值得注意的是,编译器不需要保留预初始化的变量,因此,由于所讨论的代码既不使用参数也不使用此参数,因此代码可以在所有示例方法中重复使用变量索引零,典型的编译器实现不会这样做。哦,我理解,非常感谢您的回答:值得注意的是,编译器不需要保留预初始化的变量,因此,由于所讨论的代码既不使用参数,也不使用此参数,因此代码可以在所有示例方法中重复使用变量索引零。典型的编译器实现不会这样做。