静态分配和动态分配

分派是java三大特性中 (封装 继承 多态 )多态的一种体现,多态包含重载和重写,重载是静态分派 重写是动态分派

这里所说的静态分派和动态分派其实就是方法调用的一种方式,除此还有解析调用(一般性的调用,在jvm 加载类的时候符号引用转化我直接引用)

静态分派举例子:

原因就是 静态分派 他实际上 使用的是编译类型

动态分派:

举例子:重写
那重写虚拟机是怎么实现的?
invokevirtual指令
那这个指令具体有哪个作用,或者过程?
操作数栈顶找到实际对象类型
去这个类型里根据方法的名称和描述找,没找到就去父类找,如果还是没找到丢异常
重写的本质
invokevirtual指令就会把运行时常量池中符号引用解析为不同的直接引用,这就是方法重写的本质。

虚拟机动态分派的实现
虚方法表
虚方法表中存放着各个方法的实际入口地址(由于Java虚拟机自己建立并维护的方法表),如果子类没有覆盖父类的方法,那么子类的虚方法表里面的地址入口与父类是一致的;如果重写父类的方法,那么子类的方法表的地址将会替换为子类实现版本的地址。
初始化时期:
方法表是在类加载的连接阶段(验证、准备、解析)进行初始化

你可能感兴趣的:(jvm)