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

时间:2016-08-10 18:19:37

标签: java methods scope

这段代码在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号将被放置在堆栈上,当getNumber返回时,它将被弹出并可能被覆盖。

C中相同的代码是否可能不安全?

2 个答案:

答案 0 :(得分:0)

HelloWorld类没有字段,因此是不可变的。您可以使用相同的对象从任何线程中多次调用getNumber(x)函数,并且它将始终为同一参数提供相同的结果。

也许你的同事正在回忆C中的恐怖故事,你可以在其中找到类似static int number的东西,其中"属于"该方法将被覆盖。或者也许她正在思考"通过引用返回&#34 ;;即使它是,你每次都会引用一个全新的对象,因为number是为每个方法调用新实例化的。

答案 1 :(得分:-2)

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

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

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

我怀疑混淆来自C(这种类型的代码在C中运行良好),但对于指针而不是基元。从C中的函数返回malloc的结果可以是"挑战"如果你做得不对。