虚拟机和物理机不同之处在于他们的执行引擎不一样,物理机的执行引擎是cpu、内存,虚拟机需要自己定义一个指令集、自己实现一个虚拟的引擎等等,由这个虚拟的引擎去执行。虚拟机规范定义了一个虚拟机的外观,但是没有规定如何去具体的执行class文件,可以解释执行也可以编译成本地代码再执行。
如图所示一个线程对应一个虚拟机栈,这个线程在执行所有的方法的时候都在这个虚拟机栈里。一个方法被执行的时候,就会有一个栈帧被压入虚拟机栈,如果这个方法又调用了其他的方法就会有新的栈帧被压入栈,所以只有位于栈顶的栈帧是有效的,被称为当前栈帧,与该栈帧关联的方法被称为当前方法,执行引擎运行的所有字节码都是针对当前栈帧进行操作的。
一个栈帧里包括操作数栈,局部变量表等附加信息。下面会对这些信息详细的介绍。
虚拟机如何实现“重载”和“重写”。首先引入了两个重要的概念,变量的静态类型和动态类型。Man man = new Human(),Human继承了Man对象,此时Man被称为变量的静态类型Human被称为变量的实际类型。编译期间能够知道的类型被称为静态类型,编译期间不能知道的类型被称为实际类型。
之所以编译期间不知道实际类型,其实是不知道实际类型的具体类的地址,因为在编译期间一个不存在连接,所以引用是以全限定名的形式存在于常量池中的,只有在运行期间才能真正知道一个变量的实际的类型。
1、静态分派
重载版本的选择是根据传入参数的类型和数目来决定的,具体而言是根据参数的静态类型来决定的。因此在编译截断就可以确定重载方法。
所有根据一个变量的静态类型来确定方法执行版本的分派机制被称为静态分派,变量的静态类型在编译期间就可以确定所以静态分派在编译期间发生。因此实际来说,静态分派的执行过程不是由虚拟机实现的,而是由编译器实现的。
2、动态分派
原文:https://www.cnblogs.com/AshOfTime/p/10304937.html