在Java中调用方法后会发生什么

时间:2013-11-21 21:07:59

标签: java methods

这看起来像一个愚蠢的问题,但我发现很难做到这一点。我问过不同的人,但无法得到理想的答案。

我想知道在Java中调用普通方法后会发生什么(在单线程环境中提供)。

我的理解是:

  1. 所有当前堆栈变量都已加载并存储在某处(其中?)
  2. 当前方法调用暂停
  3. 新调用方法的参数被推送到堆栈
  4. 方法代码运行
  5. 方法运行完毕后,堆栈再次清空,旧堆栈内容再次恢复。 (如果函数返回值会发生什么?)。
  6. 代码继续使用调用方法。
  7. 这是一个非常不完整且可能错误的答案。有人可以提供更详细的描述吗?

    非常感谢。

2 个答案:

答案 0 :(得分:3)

不,这实际上相当准确:

1)当前堆栈变量保留在堆栈中

2)当前方法暂停

3)新调用方法的参数被推送到堆栈

4)方法代码运行

5)方法运行完毕后,我们弹出堆栈。被调用方法的堆栈变量不再有效 - 此时它们不再“存在”。

6)我们将返回值(如果有的话)传递给调用者

7)代码继续使用调用方法。所有它的堆栈变量都保持不变。

==============================

附录:

@Kevin -

  • 从概念上讲,我认为你说得对。我澄清了几点,希望有所帮助。

  • 如果您想深入了解JVM如何实现“方法调用”,David Wallace的链接非常好。

  • 以下是“堆栈”工作原理的概述。任何堆栈,调用任何子例程 - 不仅仅是Java:http://en.wikipedia.org/wiki/Call_stack

  • 最后,Marko Topolnik是正确的。 “现实”几乎总是很复杂,它不适合简单,一刀切的答案。但我绝对认为你的理解是好的。至少在10,000英尺的高度。

... IMHO

答案 1 :(得分:1)

对于解释器,假设一个实例方法,并采取一些小的自由:

  1. 对象指针用于引用对象,并从那里引用Class对象。
  2. 方法指针位于Class对象中。 (将方法名称转换为方法索引的查找主要在加载类时完成,因此这基本上只是一个数组索引操作。)
  3. 通常会将某种“标记”推送到JVM堆栈上。这将包含调用者的指令指针,以及指向其堆栈基础的指针。 (这里有很多不同的实现。)
  4. 查看方法的定义以查看需要多少本地变量。那么多空白元素被推到堆栈上。
  5. 对象(“t​​his”)指针存储在本地var 0中,任何parms都存储在1,2,3 ...中。
  6. 控制转移到被调用的方法。
  7. 返回时,堆栈会弹出到调用开始的位置,任何返回值都会被压入堆栈,控制权将转移回调用者。

    编译代码在概念上是相似的,只是它使用“C”堆栈,而JITC环境中的解释代码将使用JVM堆栈和“C”堆栈。