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

how does the jvm handle polymorphism and its optimization

本文关键字:多态性 优化 处理 何处理 JVM      更新时间:2023-10-16

我有一个接口I和一个方法m,以及两个行为不同的实现类A和B。

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

这个问题也让我对C++虚拟方法唠叨。

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

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

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

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