Java - 虚拟方法

时间:2010-03-21 06:14:04

标签: java

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

3 个答案:

答案 0 :(得分:37)

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

答案 1 :(得分:14)

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

答案 2 :(得分:13)

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

  

对象的调度表将会   包含对象的地址   动态绑定方法。方法   通过获取来执行调用   方法的对象地址   派遣表。调度表是   属于的所有对象都是一样的   同一类,因此   通常在他们之间共享。对象   属于类型兼容的类   (例如,一个兄弟姐妹   继承层次结构)将有   具有相同布局的调度表:   给定方法的地址   出现在所有人的相同偏移处   类型兼容的类。从而,   从a获取方法的地址   给定的调度表偏移量将得到   对应的方法   对象的实际类。