class X
{
public void foo()
{
}
}
然后在你的主要你有
X anX = new X();
anX.foo();
X bX = new X();
bX.foo();
是为每个X实例复制的“foo”方法吗?或者是每个实例只是重新使用foo方法代码。
答案 0 :(得分:1)
它将重用每个对象的方法代码。隐式参数是什么变化,它是您调用方法的对象。
答案 1 :(得分:1)
使用Class指针和内部虚方法表派发实例方法(或多或少)。类似但稍微更间接的&对于通过接口访问的方法,速度较慢。
每个ClassLoader& amp;类加载一次类VMT和方法代码。然后使用该方法在所有对象之间共享。因此,类型信息&方法代码不会在内存中重复。
对象始终保持其类指针和(内部)虚方法表。这适用于是否转换为子类型或分配超类型。对象类和内部指针在构造时分配,并在对象的生命周期内保持不变。
静态方法OTOH未虚拟化,请勿使用VMT&根据参考的静态类型发送。这在编译时解决。