变量本身的静态类型不会被改变
最终的静态类型在编译器中可知
实际类型:
实际类型变化的结果在运行期才确定下来
编译器在编译期间并不知道一个对象的实际类型是什么
Human human = new Man...,静态类型在编译期间可以知道:
编译阶段,Javac编译器会根据参数的静态类型决定使用哪个重载版本
静态分派:
所有依赖静态类型来定位方法的执行版本的分派动作
典型应用 :方法重载
静态分派发生在编译阶段...变量man在两次调用中执行了不同的方法
导致这个现象的额原因 :这两个变量的实际类型不同
Java虚拟机是如何根据实际类型分派方法的执行版本的: 从invokevirtual指令的多态查找过程开始 ,...), 使用虚方法表索引代替元数据查找以提高性能
虚方法表中存放着各个方法的实际入口地址:
如果某个方法在子类中没有被重写,那子类的虚方法表里面的地址入口和父类相同方法的地址入口是一致的,都指向父类的实际入口...如果子类中重写了这个方法,子类方法表中的地址将会替换为指向子类实际方法的入口地址
具有相同签名的方法,在父类,子类的虚方法表中具有一样的索引序号:
这样当类型变换时,仅仅需要变更查找的方法表,就可以从不同的虚方法表中按索引转换出所需要的入口地址