java的三大特性:继承、封装、多态。
1.运行时栈帧结构
每个栈帧包括:局部变量表、操作数栈、动态连接、方法返回地址和一些额外的附加信息。
栈帧中需要多大局部变量表以及多深的操作数栈在编译代码的时候就已经确定了,并且写入方法表的code属性中。
局部变量表:存放方法参数和方法内部的局部变量。
操作数栈:后入先出栈。(用于暂存运算过程中的操作数)
动态连接:字节码中的方法调用指令都是以常量池中的符号引用作为参数,这些引用若在类加载阶段或第一次使用的时候就转换为直接引用,这种转换成为静态解析。若在每一次运行期间转化为直接引用,则为动态连接。每个栈帧都含有一个指向运行时常量池中该栈帧所属方法的引用,为了支持方法调用过程中的动态连接。
2.方法调用
方法调用阶段唯一任务是确定调用方法的版本,即确定调用哪个方法。
解析:类加载的解析阶段,会将一部分符号引用转化为直接引用。解析调用是静态过程,编译期间就确定。(静态方法、私有方法、实例构造器<init>方法、父类方法)
分派dispatch:方法调用可能是静态也可能是动态。静态分派(method overload resolution重载),重载是通过静态类型作为判定依据。动态分派:重写,方法调用时根据对象的实际类型C查找C中是否存在相符的方法,若不存在,按照继承顺序从下往上的查找。
3.基于栈的字节码解释执行引擎
java基本上是一种基于栈的指令集架构。基于栈优点:可移植、代码紧凑(每个字节对应一条指令,而多地址指令集中还需存放参数)、编译器实现简单(无需考虑空间分配问题,都在栈上操作)缺点:执行速度慢(频繁出入栈)。基于寄存器的指令集:速度快
基于栈的解释器执行过程:
如:计算1+1,基于栈的指令集:
iconst_1 //将常量1放入操作数栈栈顶
iconst_1 //将常量1放入操作数栈栈顶
iadd //将操作数栈中头两个元素出栈,做整型加法,然后结果2重新入栈。
istore_0 //把栈顶值放入到局部变量表的第0个slot中