虚方法表与动态分派机制详解
针对于方法调用动态分派的过程,虚拟机会在类的方法区建立一个虚方法表的数据结构(virtual method table,vtable);
针对于invokeinterface指令来说,虚拟机会建立一个叫做接口方法表的数据结构(interface method table,itable);
public class MyTest7 {
public static void main(String[] args) {
Animal animal = new Animal();
Animal dog = new Dog();
animal.test("hello");
dog.test(new Date());
}
}
class Animal{
public void test(String str){
System.out.println("animal str");
}
public void test(Date date){
System.out.println("animal date");
}
}
class Dog extends Animal{
@Override
public void test(String str) {
System.out.println("dog str");
}
@Override
public void test(Date date) {
System.out.println("dog date");
}
}
运行结果:
animal str
dog date
-
从字节码指令分析下面代码为什么会报错:
因为:
Animal dog = new Dog(); dog.method();
在字节码中invokevirtual中的引用方法是Animal中的方法, 因为Animal没有method()方法,所以在编译期间就会报错。