JVM如何解析java

时间:2016-09-08 12:16:44

标签: java polymorphism

根据我对C ++中多态性的了解(如果我错了,请纠正我)

对于C ++中的运行时多态,Compiler为每个对象维护两个第一个vptr,为每个类维护vtable。每当我们调用一个重写方法时,编译器首先获取引用对象的vptr,然后转到相应类的vtable,然后获取相应方法的地址并执行。

现在我的问题是,

JVM如何执行此任务?

它是否也保持了vtable?

如何在方法区域中存储重写和重写方法??

当我们通过使用引用子类对象的超类引用从子类调用覆盖方法时,实际发生了什么?

1 个答案:

答案 0 :(得分:1)

这在invokevirtual

的规范中有所描述
  

设C为 objectref 的类。要调用的实际方法由以下查找过程选择:

     
      
  • 如果C包含一个覆盖(§5.4.5)已解析方法的实例方法m的声明,则m是要调用的方法,查找过程终止。

  •   
  • 否则,如果C具有超类,则使用C的直接超类递归地执行相同的查找过程;要调用的方法是递归调用此查找过程的结果。

  •   
  • 否则,会引发AbstractMethodError

  •