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

Java 在非静态方法中,是否每次创建对象时都复制该方法?,java,Java,例如,假设您有: 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方法代码。

它将为每个对象重新使用方法代码。更改的是隐式参数,它是调用方法的对象。

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

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

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


静态方法OTOH不是虚拟化的,不要根据引用的静态类型使用VMT&Dispatch。这在编译时得到解决。

每个实例使用相同的
foo
方法,至少在子类中被重写。方法在类的实例之间共享。每个对象都会说“嘿,我就是这个对象,调用这个相对于我的方法。”因此,非静态方法和静态方法之间的唯一区别是,静态方法可以在不创建对象的情况下调用。它们的相同之处在于,该方法只存在一个“主副本”,并且“主副本”是用于所有操作的唯一“主副本”。该“主副本”位于JVM的Perm Gen内存空间中,请参见这个已经回答过的问题:另外,在继承、向上投射+向下投射和多态性的情况下,创建派生对象时会发生什么。它是否类似于上面新的派生对象只是重复使用现有的基本对象方法代码?在重写派生类中的方法的情况下会发生什么?将派生对象向上转换为基础对象时会发生什么?