使用方法的返回值和离开它们之间的区别是什么?

时间:2015-04-06 08:07:13

标签: java memory return-value

下面,您将看到两个非常简单的Java程序。在第一个程序中,我没有使用returnTrue()方法的返回值,而在第二个程序中,我将其分配给静态字段。< / p>

第一个程序:

package test;
public class Test {
    public static void main(String[] args) {
        returnTrue();
        System.out.println("Finished!");
    }

    public static boolean returnTrue() {
        return true;
    }
}

第二个程序:

package test;
public class Test {
    public static boolean Result;

    public static void main(String[] args) {
        Result = returnTrue();
        System.out.println("Finished!");
    }

    public static boolean returnTrue() {
        return true;
    }
}

两者都工作正常,并在输出中打印"Finished!"

现在,我想知道如果我将returnTrue()行置于无限循环中会在内存中发生什么?据我所知,在第二个程序中,它将true无限地分配给内存中的特定地址(即Result的地址)。 (右?)

但我对第一个计划一无所知。在那种情况下会发生什么? JRE是否选择随机地址并将所有返回值分配给同一地址?或者它将每个返回值分配给特定地址?或者甚至它离开它并且没有将它分配给任何地址?

1 个答案:

答案 0 :(得分:4)

当一个方法返回时,返回值通常留在内存中的线程堆栈中,无论调用代码何时停止。 stack是通常用于此目的的重要数据结构。

假设我们有一些如下代码:

void m1() {
    int i;
    int j;
    boolean b = m2();
}

boolean m2() {
    float f;
    float g;
    return true;
}

m1开始执行时,堆栈开始扩展以保留局部变量的空间:

int
int
boolean
调用

m2并再次扩展堆栈:

int
int
boolean
    float
    float

m2返回,堆栈以相反的顺序展开:

int
int
boolean

请注意,堆栈的最后一个空格很方便我们的本地变量返回m2的返回值,其中true被存储。

当您将返回值分配给某个内容时,原始值或对象引用会从堆栈复制到您为其分配的位置(在本例中为静态字段)。

如果您不将其分配给任何内容,则只会忽略返回值。

  

[...]如果我将returnTrue()行置于无限循环中,会在内存中发生什么?

重复执行上述步骤。

  

JRE是否选择随机地址并将所有返回值分配给同一地址?或者它将每个返回值分配给特定地址?

见上文,它被放入堆栈。