举例说明:局部变量表所需的容量大小是在编译期确定下来的
public class LocalVariablesTest {
private int count = 0;
public static void main(String[] args) {
LocalVariablesTest test = new LocalVariablesTest();
int num = 10;
test.test1();
}
public void test1() {
Date date = new Date();
String name1 = "baidu.com";
String info = test2(date, name1);
System.out.println(date + name1);
}
public String test2(Date dateP, String name2) {
dateP = null;
name2 = "xiexu";
double weight = 185.5;//占据两个slot
char gender = '男';
return dateP + name2;
}
}
反编译后,可得结论:
JClassLib 参数详解
在构造器以及实例方法中,对象引用this 都会存放在索引为0的位置
//构造器
public LocalVariablesTest() {
this.count = 1;
}
//实例方法
public void test1() {
Date date = new Date();
String name1 = "baidu.com";
test2(date, name1);
System.out.println(date + name1);
}
64位的类型(long和double)占用两个slot
public String test2(Date dateP, String name2) {
dateP = null;
name2 = "xiexu";
double weight = 185.5; //占据两个slot
char gender = '男';
return dateP + name2;
}
可以看到,weight为double类型,索引从3直接跳到5,说明double占据两个slot
static方法无法调用this
public static void testStatic() {
LocalVariablesTest test = new LocalVariablesTest();
Date date = new Date();
int count = 10;
System.out.println(count);
//因为this变量不存在于该静态方法的局部变量表中!!!
// System.out.println(this.count);
}
栈帧中的局部变量表中的槽位是可以重用的,如果一个局部变量出了其作用域,那么在其作用域之后声明新的局部变量就很有可能会复用过期局部变量的槽位,从而达到节省资源的目的。
public void test4() {
int a = 0;
{
int b = 0;
b = a + 1;
}
//变量c使用 之前已经销毁的变量b占据的slot的位置
int c = a + 1;
}
可以看到,局部变量c 重用了 局部变量b 的slot位置