在学习JVM 局部变量表的时候, 最好是借助字节码指令查看工具 (jclasslib bytecode viewer), 可以很直观的了解局部变量表,以及其与方法或者类之间的关系。
jclasslib bytecode viewer 可以在Android studiol 的plugin 插件中添加, 网上有很多教程。
1. 以一段简单的代码了解 this 变量的使用
public class LocalVariablesTest {
private int mCount = 0;
public static void main(String[] args) {
//因为this 变量不存在于当前方法的局部变量中??
//System.out.println(this.mCount);
LocalVariablesTest test = new LocalVariablesTest();
test.test1();
LocalVariablesTest.test2();
}
public void test1(){
System.out.println("test1()");
System.out.println(this.mCount);
}
public static void test2(){
System.out.println("test2()");
//因为this 变量不存在与当前方法的局部变量中??
//System.out.println(this.mCount);
}
}
可以看出, this 变量不存在于静态方法的局部变量表中, 因此静态方法无法使用this (可通过类名.)
2. 了解字节码指令 (局部变量表)
可以看到各个方法(Methods)中的 字节码指令(code) 、 行号对应表(LineNumberTable) 、局部变量表(LocalVariableTable).
test1 方法局部变量表如下所示
test2 方法局部变量表如下所示
其中,
(1) LocalVariableTable 表示局部变量表
列Name表示变量名, Start PC表示变量在字节码指令的作用域的起始位置,length 表示作用域的长度或者范围。
(2) LineNumberTable 表示字节码指令行号 与 JAVA 代码的行号 的对用关系。
拓展:
变量的分类
1. 成员变量 :
(1)类变量: Linking (链接) 的prepare 阶段会设置默认值; 在初始化阶段 赋值 (程序员写的)
(2) 实例变量:默认值, 存放在堆中
2. 局部变量:没有默认值,在使用前必须初始化 (局部变量也会引起内存没被回收问题)