我想知道我是否在java中有一个对象,它的实例方法是如何存储的?对象是否有指向它的实例方法的指针?
示例:
public class MyObject {
private int x;
private int y;
[..]
}
如果我计划在内存中保留这些MyObject
的很多(例如一个大的对象树),如果除了x的吸气剂和yi定义一个,它会在内存方面产生显着的差异吗?实例方法计算总和?
我正在尝试解决问题,我应该使用getter和setter添加更多实例方法或在另一个类中进行计算。
答案 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(),您可以在运行时访问所有方法的列表。