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