jvm如何处理多态性及其优化

时间:2012-05-19 19:55:19

标签: c++ jvm polymorphism virtual

我认为有一个接口I有一个方法m,两个实现类A和B表现不同。

A和B的对象仅使用内存作为其值和引用类型,而不是其方法。存储在类型I的变量中的A的对象存储有引用(指针大小开销)加上对象的大小。现在调用方法m。现在存储了这一位信息的位置,必须从类B调用来自A类的方法?

这个问题也让我误解了C ++虚拟方法。

interface I { void m(); }
class A implements I { void m(){println("a");} }
class B implements I { void m(){println("b");} }

2 个答案:

答案 0 :(得分:1)

在C ++中,每个对象通常都包含一个隐藏指针( vptr )到一个函数地址表( vtable )。每个类有一个vtable,包含其虚函数实现的地址。请参阅http://en.wikipedia.org/wiki/Virtual_method_table

我想Java以类似的方式实现事物(尽管我没有研究过这个)。

答案 1 :(得分:1)

在实际执行代码(JIT)中,至少Hotspot JVM有时可以直接调用正确的方法(有效地去虚拟化)如果它可以确定它是哪一个。因为它也处理类加载,所以类层次结构是已知的,所以如果周围没有B的实例,则可以确定它是例如A(单态)。如果稍后创建B的实例,它可以反向优化并仍然进行一些优化(仍然只有两个选择,双态)。