方法中实例化的变量范围——Java



这个代码在Java中安全吗?

public class HelloWorld {
    public static void main (String args[]) {
        HelloWorld h = new HelloWorld();
        int y = h.getNumber(5);
        int z = h.getNumber (6);
        if (y == 10)
            System.out.println("true"); 
    }
    public int getNumber(int x) {
        int number = 5;
        number = number + x;
        return number;
    }
}

我的同事说int number将被放在堆栈上,当getNumber返回时,它将被弹出并可能被覆盖。

相同的代码在C中可能不安全吗?

HelloWorld类没有字段,因此是不可变的。您可以在任何线程中使用相同的对象调用getNumber(x)函数,并且对于相同的参数,它总是会给出相同的结果。

也许你的同事正在回忆C语言中的恐怖故事,在那里你可以有像static int number这样的东西,它"属于"该方法,并且会被覆盖。或者她在考虑"引用返回";即使它是,您也会每次引用一个全新的对象,因为number是为每个方法调用新实例化的。

你的同事在某种程度上是正确的,但他们显然误解了发生的事情。

    public int getNumber(int x) {
        int number = 5;
        number = number + x;
        return number;
    }

是的,5 + 5或5 + 6的值将被放置在堆栈中,但没有被覆盖的危险,它们将被正确地放置在y或z中。

我怀疑这种混淆来自C(这种类型代码在C中也可以很好地工作),但对于指针而不是原语。如果你做得不对,从C函数返回malloc的结果可能是"具有挑战性的"。

最新更新