如何存储实例方法
可能重复:
内存中的Java / C#方法表示
我想知道我是否在java中有一个对象,它是如何存储实例方法的? 对象是否有指向它的实例方法的指针?
例:
public class MyObject { private int x; private int y; [..] }
如果我计划在内存中保留这些MyObject
的很多(例如一个对象的大树),如果除了x的getter和yi定义计算总和的实例方法,它会在内存方面产生显着差异吗?
我正在尝试理清我应该添加更多实例方法或使用getter和setter在另一个类中进行计算。
对象需要内存以获取其属性(注意:对于对象,存储的属性是指向真实对象的指针,该指针位于内存中的其他位置)。 方法(代码)不需要额外的内存,因为它们与类一起存储。
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() { } }
每个实例使用相同的内存。
对象的实例方法存储在其类对象中(只应存在一个副本),它们不会与每个新实例“复制”,而是在引擎盖下每个实例都包含对驻留在类对象中的方法实现的引用。
有关技术说明,请参阅“Java虚拟机内部”一书中的本章 ,特别是“对象表示”部分; 它详细说明了对象的每个实例如何在相应的类中引用其方法。 请注意,JVM规范中不存在此实现细节,并且它们对实现者保持开放 – 链接文档提供了几种策略。
它们存储在类中。 详细信息在JVM规范中 。
不,它不会产生重大影响。 该方法实际存储在类定义文件MyObject.class
。 该方法只有一个实例。 它为每个实例执行,但只定义一次。
每个实例都与一个类相关联。
该类定义了所有实例的方法。
因此,不需要为每个实例指定方法的指针。
实例只存储非静态属性的值
如果您想知道实例的类,只需使用instance.getClass()。
通过使用getClass(),您可以在运行时访问所有方法的列表。