本博文主要讲解的内容
1.栈帧的主要组成
2.局部变量表详解
1.栈帧的而主要组成
- 局部变量表
- 操作数栈
- 动态链接
- 方法返回地址
- 一些附加的信息
2.局部变量表详解
public class Runtime3 {
private int count=0;
public static void main(String[] args) {
Runtime3 runtime3 = new Runtime3();
int num=10;
runtime3.test1();
}
public void test1(){
Date date = new Date();
String name1="psf";
String info=test2(date,name1);
System.out.println(date+name1);
}
public String test2(Date dateP,String name2){
dateP=null;
name2="psy";
double weight=110.0;
char gender='男';
return dateP+name2;
}
public void test3(){count++;}
public void test4(){
int a=0;
{
int b=0;
b=a+1;
}
int c=a+1;
}
}
运行上面的代码,利用反编译工具看各个方法的局部变量表来观察规律:
- 对于main方法而言。它是一个静态的方法,它的局部变量表中应当有参数args,Runtime3类的对象实例,num。它们在表中的顺序是按照声明的顺序。
进行下一部分的非静态方法的讲解时,我们需要了解一点其它的知识:
变量槽:
值得我们注意的有两点:一是不同类型的变量占据的槽位大小不同。除了long和double类型的变量占据两个槽位之外,其它类型都占一个。二是非静态方法会把当前对象放在第一个槽位。
- 对于非静态的方法而言。
查看test1方法的局部变量表:
可以看到this确实是放在第一位的。
查看test2方法的局部变量表:
weight变量是double类型的,占据3,4两个槽位。
查看test3的局部变量表:
它的局部变量表有点特殊,它使用了count变量,却没有在局部变量表中找到它的身影。因为count是全局的变量,并不是一个局部变量。
查看test4的局部变量表:
明明有四个变量(加上this),为什么只有三个槽位?
因为b变量是声明在一个静态的代码块中,离开了代码块那么它就可以从槽位中离开让出位置。
但是局部变量表中还是有四个变量的。