虚拟函数如何在继承中的幕后工作? 编译器是否特别处理虚函数?
答案 0 :(得分:37)
默认情况下,java中的所有方法都是虚拟的。这意味着在继承中使用任何方法都可以被覆盖,除非该方法被声明为final或static。
答案 1 :(得分:14)
'Virtual'是一个C ++术语。 Java中没有虚拟方法。有一些普通的方法,它们是运行时多态的,而静态或最终的方法则不是。
答案 2 :(得分:13)
是的,编译器和运行时对虚拟方法的处理方式不同。 JVM专门使用virtual method table进行虚拟方法调度:
对象的调度表将会 包含对象的地址 动态绑定方法。方法 通过获取来执行调用 方法的对象地址 派遣表。调度表是 属于的所有对象都是一样的 同一类,因此 通常在他们之间共享。对象 属于类型兼容的类 (例如,一个兄弟姐妹 继承层次结构)将有 具有相同布局的调度表: 给定方法的地址 出现在所有人的相同偏移处 类型兼容的类。从而, 从a获取方法的地址 给定的调度表偏移量将得到 对应的方法 对象的实际类。