这个代码在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的结果可能是"具有挑战性的"。