【问题标题】:Are public Java methods actually get copied into a new object when an object is created from a class?从类创建对象时,公共 Java 方法实际上是否被复制到新对象中?
【发布时间】:2014-01-29 22:56:01
【问题描述】:

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

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

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

【问题讨论】:

  • 没有。方法通过对象引用(如果有)调用,如果没有实例,则通过静态引用(例如类)调用。
  • 值得注意的是,方法是否公开与此无关。是否是静态的(显然静态方法不会被复制)。
  • @Kuba Spatny 不,这不是我想要的。
  • @user3081519 不是吗?正如安迪·托马斯在公认答案的 cmets 中指出的那样——这并不是那么简单。链接中包含 IMO 更多详细信息,例如 On a deeper level, when the compiler puts an object together, it contains several pointers to methods. When those methods are executed it follows the pointers and executes the code at the far end.

标签: java oop object methods


【解决方案1】:

这样的类方法:

public class MyClass {
    public void myMethod(int arg) { }
}

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

public static void myMethod(MyClass this, int arg) { }

this 参数是根据您正在调用该方法的对象隐式传递的。从这个定义中,很明显您不需要为每个类的实例创建一个单独的副本。

正如 Andy Thomas 在 cmets 中提到的,在低级别上,它的细微差别远不止于此;一些信息必须在运行时为被覆盖的方法保留,而静态方法不存在这些信息。

【讨论】:

  • 不太一样——考虑虚拟方法。
  • @AndyThomas 是的,但这个概念适用,无需详细讨论 vtable 查找。我觉得这在很大程度上会使事情陷入困境。
  • @Chris Hayes 谢谢,这正是我想要的。基本教科书没有深入解释。方法的第二个定义真是让人大开眼界。
【解决方案2】:

它主要(谁知道那里有什么 JVM)不会复制每个实例的方法。它维护每个类的方法。然后它会解析哪个类持有有问题的方法并调用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-03
    • 2020-09-30
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    相关资源
    最近更新 更多