为什么java中使用局部变量必须进行初始化

258 阅读1分钟

先看一段代码

public void fn(){
    int age;
    int newAge = age++; //报错Variable 'age' might not have been initialized
}
  • 接下来以jvm的角度,解释为什么要对局部变量进行显式赋值,为什么不能像类变量那样拥有默认值

我们知道,在java中,当一个线程开始执行,此线程所执行的每个方法都会执行入栈和出栈的动作,栈中的数据都是以栈帧的格式存在,在栈帧中有一个重要的结构,被称为局部变量表(Local Variables)。栈结构如下:

image.png

  • 如图所示,局部变量表中保存着我们在方法中定义的变量(或对象的引用)。由于局部变量表所需的容量大小是在编译期确定下来的,所以在编译之前就要对局部变量进行初始化,否则无法编译通过

在idea中使用jclasslib插件进行演示 先写一个方法,方法中随意定义几个变量

public void test(){
    Date date = new Date();
    int a = 2;
    Double d = 30.0;
    String s = new String("hello");
}
  • 编译代码后点击View ----> Show Bytecode With Jclasslib

image.png

  • 可以看到,test方法中Code属性的maximum local variables(即图中的局部变量最大槽数)为5,而我们在test方法中只定义了4个变量,这是因为当前帧是由实例方法创建的,该对象引用this将会存放在index为0的slot处,其他的参数就按照顺序依次排在this的后面。展开Code节点,可以查看更多信息

image.png

总结

最近在学JVM,看到宋红康老师讲到这里有种拨云见日的感觉,这篇笔记算是对自己学习的记录。O(∩_∩)O*