簡體   English   中英

在方法內部實例化的變量范圍-Java

[英]Scope of variable instantiated inside a method - 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數字將放置在堆棧中,當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的結果可能會“具有挑戰性”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM