Java – 虚拟方法

虚拟函数如何在inheritance中的幕后工作? 编译器是否特别处理虚函数?

是的,编译器和运行时对虚拟方法的处理方式不同。 JVM专门使​​用虚方法表进行虚拟方法调度:

对象的调度表将包含对象的动态绑定方法的地址。 通过从对象的调度表中获取方法的地址来执行方法调用。 对于属于同一类的所有对象,调度表是相同的,因此通常在它们之间共享。 属于类型兼容类的对象(例如inheritance层次结构中的兄弟节点)将具有相同布局的调度表:给定方法的地址将出现在所有类型兼容类的相同偏移处。 因此,从给定的调度表偏移量中获取方法的地址将获得与该对象的实际类对应的方法。

java中的所有方法都是默认的虚拟方法。 这意味着在inheritance中使用任何方法都可以被覆盖,除非该方法被声明为final或static。

‘Virtual’是一个C ++术语。 Java中没有虚拟方法。 有一些普通的方法,它们是运行时多态的,而静态或最终的方法则不是。