如何存储实例方法

时间:2011-12-04 17:02:50

标签: java memory

  

可能重复:
  Java/C# method representation in memory

我想知道我是否在java中有一个对象,它的实例方法是如何存储的?对象是否有指向它的实例方法的指针?

示例:

public class MyObject {
 private int x;
 private int y;
 [..]
}

如果我计划在内存中保留这些MyObject的很多(例如一个大的对象树),如果除了x的吸气剂和yi定义一个,它会在内存方面产生显着的差异吗?实例方法计算总和?

我正在尝试解决问题,我应该使用getter和setter添加更多实例方法或在另一个类中进行计算。

5 个答案:

答案 0 :(得分:13)

对象的实例方法存储在其类对象中(只应存在一个副本),它们不会被复制"对于每个新实例,相反,每个实例都包含对驻留在类对象中的方法实现的引用。

有关技术说明,请查看书籍中的this chapter" Java虚拟机内部",特别是"对象表示"部分;它详细说明了对象的每个实例如何在相应的类中引用其方法。请注意,JVM规范中存在 not 的实现细节,并且它们对实现者保持开放 - 链接文档提供了几种策略。

答案 1 :(得分:12)

对象需要内存用于其属性(注意:对于对象,存储的属性是指向真实对象的指针,该指针位于内存中的其他位置)。方法(代码)不需要额外的内存,因为它们与类一起存储。

IE:

public class MyClass1 {
  private int myNumber;
}

public class MyClass2 {
  private int myNumber;
  public int MyMethod1() {
  }
  public int MyMethod2() {
  }
  public int MyMethod3() {
  }
  ....
  public int MyMethod1000() {
  }
}

每个实例使用相同的内存。

答案 2 :(得分:6)

它们存储在类中。详细信息位于JVM specification

答案 3 :(得分:2)

不,它不会产生重大影响。该方法实际存储在类定义文件MyObject.class中。该方法只有一个实例。它为每个实例执行,但只定义一次。

答案 4 :(得分:1)

每个实例都与一个类相关联。

该类定义了所有实例的方法。

因此,不需要为每个实例指定方法指针。

实例只存储非静态属性的值

如果您想知道实例的类,只需使用instance.getClass()。

通过使用getClass(),您可以在运行时访问所有方法的列表。