栈的局部变量表(解决多年困惑为什么this不能在static里面使用)

Posted strandtrack

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈的局部变量表(解决多年困惑为什么this不能在static里面使用)相关的知识,希望对你有一定的参考价值。

局部变量表(Local Variables):

概述:
局部变量表也被称之为局部变量数组或本地变量表
定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量这些数据类型包括各类基本数据类型、对象引用(reference),以及returnAddressleixing
由于局部变量表是建立在线程的栈上,是线程私有的数据,因此不存在数据安全问题
 

变量槽slot:

  • 参数值的存放总是在局部变量数组的index0开始,到数组长度-1的索引结束
  • 局部变量表,最基本的存储单元是Slot(变量槽)
  • 局部变量表中存放编译期可知的各种基本数据类型(8种),引用类型(reference),returnAddress类型的变量。
  • 在局部变量表里,32位以内的类型只占用一个slot(包括returnAddress类型),64位的类型(long和double)占用两个slot。
    • byte、short、char、float在存储前被转换为int,boolean也被转换为int,0表示false,非0表示true;
    • long和double则占据两个slot。

  • JVM会为局部变量表中的每一个slot都分配一个访问索引,通过这个索引即可成功访问到局部变量表中指定的局部变量值
  • 当一个实例方法被调用的时候,它的方法参数和方法体内部定义的局部变量将会按照顺序被复制到局部变量表中的每一个slot上
  • 如果需要访问局部变量表中一个64bit的局部变量值时,只需要使用签一个索引即可。(比如:访问long或者double类型变量)
  • 如果当前帧是由构造方法或者实例方法创建的,那么该对象引用this将会存放在index为0的slot处,其余的参数按照参数表顺序排列。

 

解决困惑:

public class LocalVariablesTest 

    private int count = 1;
    //静态方法不能使用this
    public static void testStatic()
        //编译错误,因为this变量不存在与当前方法的局部变量表中!!!
        System.out.println(this.count);
    

本质是因为this代表对象实例,而static是随类的加载而加载,先于实例之前就有的,所以不存在于局部变量表中,所以不能使用。

以上是关于栈的局部变量表(解决多年困惑为什么this不能在static里面使用)的主要内容,如果未能解决你的问题,请参考以下文章

JVM探秘6--图解虚拟机栈的局部变量表和操作数栈工作流程

$this是什么意思-成员变量和局部变量的调用

java复习第三天-局部变量的初始化和内存中的机制-this调用内存栈

11.JDK8内存模型本地方法栈虚拟机栈栈帧结构(局部变量表操作数栈方法出口虚拟机栈与本地方法栈的关系寄存器方法区堆(Heap)jvm中的常量池Metaspace(元空间))

堆和栈的区别

JVM05_虚拟机栈