当从类创建对象时,公共Java方法是否实际上被复制到新对象中?

use*_*519 0 java oop methods object

是的,纯粹的理论问题.当我们从定义的类创建一个新对象时,我真的不清楚它到底发生了什么.

对于实例变量,每次创建新的内存位置似乎是合理的,因为它们可以具有不同的值.

但我曾经想过,每次将所有类的方法复制到新对象时,在内存方面都没有任何意义.那么java在方法调用期间实际上是使用类方法还是在新对象中创建相同方法的副本?

Chr*_*yes 5

像这样的类方法:

public class MyClass {
    public void myMethod(int arg) { }
}
Run Code Online (Sandbox Code Playgroud)

概念上可以认为在JVM级别与此相同:

public static void myMethod(MyClass this, int arg) { }
Run Code Online (Sandbox Code Playgroud)

this参数传递隐含基于对象要调用的方法.从这个定义,很显然,你不会需要一个单独的副本之类的每个实例.

正如安迪·托马斯在评论中提到的那样,在较低的层次上,它比这更具细微差别; 对于重写方法,必须在运行时保留一些信息,静态方法不存在这些信息.