2017-09-26 131 views
-5

确实每个对象都有自己的实例变量副本。但是,像静态成员一样,只有一个实例方法副本是真的吗?如果是,那么它驻留在内存中的位置?java中的实例方法

+1

[Java静态方法的内存模型]的可能重复(https://stackoverflow.com/questions/28100825/java-memory-model-for-static-methods) – Progman

+0

每个对象都有自己的实例变量副本,并且实例方法。静态变量和静态成员以类别形式存在 – SkrewEverything

+0

每个对象都有自己的实例变量副本,但不包含静态变量或任何方法。实例方法只有一个副本,但是在调用实例方法时,将拥有对象的引用放在堆栈上,以便运行时可以识别调用该方法的实例。 –

回答

0

但的确,像静态成员一样,只有一个 实例方法的副本?

是的,无论实例的数量和方法是否为静态,对于所有对象只有一个副本。

如果是,那么它驻留在内存中?

堆。

1

只需要在内存中有一个实例方法的副本。当一个实例方法被调用时,会有一个隐含在栈中的“this”变量。 “this”变量允许实例方法访问调用它的对象实例的实例变量。

包括它们的方法在内的类通常会在长期存在的堆中结束,因为它们很少被垃圾收集。

0

是的。逻辑上,一个类的每个实例中的方法共享一个算法。内存的行为方式与此类似。每个对象调用一个方法算法,并且在方法调用期间将所需值推入临时堆栈。

方法是一组遵循的指令,而不是数据结构。它不应该专门分配内存。

方法调用指令分别存储在RAM中,与其他应用程序指令相同。这不是Java内存分配过程的一部分。