1. 程式人生 > >為什麼區域性變數必須手動賦值?而全域性變數不用手動賦值也可以初始化?

為什麼區域性變數必須手動賦值?而全域性變數不用手動賦值也可以初始化?

實在知乎上看的答案,感覺很好,就轉載一下,原文地址:
  1. 首先 Java 語言就是這麼規定的。
  2. 然後為什麼 Java 語言要這麼規定呢?有什麼內部機理嗎?
可能的原因如下,當我們新建一個物件時,Java會在Heap中申請一塊記憶體區域用以存放類的資料。而成員變數就是類的資料,也是放在這塊記憶體區域中的。只需要JVM在申請記憶體的時候順便把整塊區域都置為零即可完成初始化,方便快捷。
而對於方法的區域性變數,是線上程的Stack中,當然Stack他也可以幫我們初始化,不過有一個問題。對於有些區域性變數,在方法的一開始是沒有的,有些在迴圈中的區域性變數是要反覆的宣告多次的。有些區域性變數作用域結束後,另一個區域性變數又會佔用這個區域性變數的位置。
那麼初始化要放在何時呢?當然JVM可以幫我們初始化多次,不過那樣或許會帶來效能問題。
for (int i = 0; i < 10; i++) {
    int n;
    if (i % 2 == 0) {
        n = 10;
    } else {
        n = 20;
    }
}
像是這個n,我們完全不用JVM幫我們初始化,如果每次迴圈他都幫我們初始化一次,那麼是沒有必要的。綜上所述,對於區域性變數,可能不幫我們初始化是一個不錯的選擇。(而且JVM實現起來也更容易!!!)回答二:

首先明文規定:區域性變數是指類方法中的變數,必須初始化。

理由:區域性變數執行時被分配在棧中,量大,生命週期短,如果虛擬機器給每個區域性變數都初始化一下,是一筆很大的開銷,但變數不初始化為預設值就使用是不安全的。出於速度和安全性兩個方面的綜合考慮,解決方案就是虛擬機器不初始化,但要求編寫者一定要在使用前給變數賦值。



作者:張大大的假貨
連結:https://www.zhihu.com/question/30516949/answer/182369229
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。