java - Java 方法中如何返回值?

标签 java reference return stack return-value

所以我想知道Java中如何返回值。如果我从函数 A 调用函数 B,那么我们会将 B 的堆栈帧分配到调用堆栈上。假设在 B 中我们创建了一个名为 Var 的变量,并且希望将 Var 返回给 A。如果在返回期间 B 的堆栈帧从堆栈中弹出,并且 Var 是 B 堆栈帧的一部分,那么 Var 是否不再存在?那么我们如何将变量从方法 B 返回到方法 A 呢?

最佳答案

为了了解返回值的工作原理,可能最好转向低级编程,主要是为了更好地理解。假设我们出于某些原因执行了一个方法,并且该方法的结果将被返回。结果将保存在内存中的特殊寄存器中,该寄存器仅负责保存从方法返回的值。在低级编程语言(如汇编语言)中,它被标记为$v0。我确实认为有两个返回寄存器$v0,$v1。让我们考虑以下示例:我们有 3 种方法。 A()、B() 和 C()。 A() 需要来自 B() 方法的值,而 B() 需要来自 C() 方法的值。在编译过程中,C() 方法将首先被执行,并且一个名为 Return Address($ra) 的特殊寄存器将记住方法 C() 被调用的位置(假设它是在位置 0x100 处调用的)。另外,我们假设 C() 在内存中的位置是 0x200。一旦 C() 完成执行,寄存器 $v0 将包含 C() 返回的值。现在,为了返回并继续执行方法 B(),我们必须跳转到 $ra 中保存的地址。这是通过一个名为 jr(jump register) - jr $ra 的函数完成的。为了使用 C() 的返回值,现在我们可以访问包含所需信息的 $v0 寄存器。一旦被访问,$v0寄存器的值就不再安全了,所以它可能随时改变,但我们已经完成了工作。对于 B() 也同样有效,其中返回值将在 $v0 中被覆盖并由 A() 使用。实际上这个工作是由 JVM 完成的,后面的步骤可能不完全相同,但总的来说就是这样的。

关于java - Java 方法中如何返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56993646/

相关文章:

java - 尝试查询 MongoDB 数据时出现问题

c# - 弱引用优势

C++ 如何通过映射值指针更新成员值

reference - 有没有办法返回对函数中创建的变量的引用?

java - 使用方法返回输入到数组中的值的数量

Java - 为什么没有基于返回类型的方法重载?

java - 将 String 设置为不为 null 的值

java - 动态规划 : Balanced Partition

java - 搜索方法只搜索第一行java

c++ - 如何返回线交叉点?线并不总是相交