java面試題0003-試著輸出未進行初始化的成員變數時,會有什麼結果?

Moscow發表於2020-08-26

如果我們嘗試輸出未進行初始化的成員變數時,會有什麼樣的情景發生?

直接上程式碼:

package components.javaTest.day3_20200826;

/**
 * Question0003:
 * 試著輸出未進行初始化的成員變數時,會有什麼結果?
 */
public class VariableInitialization {

    public int a;

    public static void main(String[] args) {
        System.out.println("a:" + a);
    }

}

大家可以先想一下,會有什麼樣的結果,“編譯報錯”、“0”、“null”...?

有了答案之後,我們看比真實結果:

可以看到編譯期間報錯了,

java面試題0003-試著輸出未進行初始化的成員變數時,會有什麼結果?

起初,沒有看提示,會不會是認為變數a沒有初始化導致編譯報錯了?

其實不是的:

java面試題0003-試著輸出未進行初始化的成員變數時,會有什麼結果?

根據英文提示,可以得知是由於a並不是由static修飾的變數,導致其無法被引用在環境當中。


既然是由於a是非靜態變數的緣故不能放在main方法裡面,我們將其用static關鍵字修飾,並且看看main方法的輸出結果:

package components.javaTest.day3_20200826;

/**
 * Question0003:
 * 試著輸出未進行初始化的成員變數時,會有什麼結果?
 */
public class VariableInitialization {
    //public int a;
    public static int a;

    public static void main(String[] args) {
        System.out.println("a:" + a);
    }
}


java面試題0003-試著輸出未進行初始化的成員變數時,會有什麼結果?

可以看到編譯通過,執行成功,並且列印結果是0,那麼問題來了:

a為什麼=0?,我們先記住下面這幾句真理

1.無論建立多少個物件,靜態資料都只佔用一份儲存區域

2.static關鍵字不能應用於區域性變數,即它只能作用於域(field)【成員變數、方法、類】

3.如果一個域是靜態的基本型別域,也沒有對它進行初始化,那麼它就會獲得基本型別的標準初值;如果他是一個物件引用,那麼它的初始化值就是null

這裡涉及到1個知識點,需要進行一次總結,就等下次吧,那就是“java物件的標準初始預設值的相關知識點總結”。


如果是非static修飾,但是並不是成員變數,而是在main方法中呢?

package components.javaTest.day3_20200826;

/**
 * Question0003:
 * 試著輸出未進行初始化的成員變數時,會有什麼結果?
 */
public class VariableInitialization {
    //public int a;
    //public static int a;

    public static void main(String[] args) {
        int a;
        System.out.println("a:" + a);
    }
}


java面試題0003-試著輸出未進行初始化的成員變數時,會有什麼結果?

可以看到編譯器是報錯了,提示a變數未曾初始化。

也就是在java裡面,一個物件如果沒有初始化,是不能夠被使用的,如果強行使用未被初始化的物件,編譯時就會報錯【在沒有找到反例之前,暫時可以理解它也是一條真理】

每日1道面試題分析,就到這,我們明天見!


非  淡  泊  無  以  明  志
非 寧 靜 無 以 致 遠 !

相關文章