0

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

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

这个问题也让我对 C++ 虚拟方法感到厌烦。

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

2 回答 2

1

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

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

于 2012-05-19T19:58:08.223 回答
1

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

于 2012-05-19T20:13:49.413 回答