在非静态方法中,每次创建对象时都会复制该方法?

时间:2013-07-24 01:51:03

标签: java

例如,假设你有:

class X
{
    public void foo()
    {

    }

}

然后在你的主要你有

X anX = new X();
anX.foo();
X bX = new X();
bX.foo();

是为每个X实例复制的“foo”方法吗?或者是每个实例只是重新使用foo方法代码。

2 个答案:

答案 0 :(得分:1)

它将重用每个对象的方法代码。隐式参数是什么变化,它是您调用方法的对象。

答案 1 :(得分:1)

使用Class指针和内部虚方法表派发实例方法(或多或少)。类似但稍微更间接的&对于通过接口访问的方法,速度较慢。

每个ClassLoader& amp;类加载一次类VMT和方法代码。然后使用该方法在所有对象之间共享。因此,类型信息&方法代码不会在内存中重复。

对象始终保持其类指针和(内部)虚方法表。这适用于是否转换为子类型或分配超类型。对象类和内部指针在构造时分配,并在对象的生命周期内保持不变。

静态方法OTOH未虚拟化,请勿使用VMT&根据参考的静态类型发送。这在编译时解决。