面試題 類成員變數的初始化時間

2021-08-26 04:40:42 字數 812 閱讀 7782

class b 

private int a=1;

public void go()

}public class a1 extends b

private int a=11;

public void go()

public static void main(string args)

}

以上**輸出結果為: 

ba=0

a1我當時以為是輸出a=11,結果回來跑了一把**後,發現為0,即:先執行a1這時只是申明變數,並沒賦值,然後執行b(),這時獲取到a是a1裡的,但還是初始值0呢,所以輸出0.

後來經資料官方的解釋為:對類變數的初始化是在執行完其構造方法的第一行**(即this或super)後才開始的。

以下**可以證實:

class b  catch (interruptedexception e) 

b.go();

}}.start();

} public void go()

}public class a1 extends b

private int a=11;

public void go()

public static void main(string args)

}

輸出結果為:

a=0aaa=11//這個是23行輸出的

a=11//這個是12行輸出的,由於另起了執行緒,所以在輸出的時候已經執行完了構造方法

類的靜態成員變數初始化時間

首先先搞明白 宣告 定義 初始化 類的靜態成員變數在類內宣告,可以多次宣告 類的靜態成員必須在類外定義,定義就是給變數分配記憶體,初始化就是給乙個變數賦初值,內建型別通常定義時預設初始化 類靜態成員變數在main函式執行前完成初始化,有靜態初始化和動態初始化 static initializatio...

類成員變數初始化

在 c 中,類的成員變數未初始化問題,取決於物件建立方式,不同的建立方式,直接導致類成員變數的初值不同。本文通過下例,得出一下結論 1.在函式體內置立乙個物件,類成員變數和普通的區域性變數一樣,是乙個隨機值。2.建立乙個全域性成員物件,類成員變數和全域性變數一樣,編譯器賦值為 0。3.在函式體內 n...

類的初始化時機

什麼情況下需要開始類載入過程的第乙個階段 載入 虛擬機器規範中並沒強行約束,這點可以交給虛擬機器的的具體實現自由把握,但是對於初始化階段虛擬機器規範是嚴格規定了如下幾種情況,如果類未初始化會對類進行初始化。建立類的例項 訪問類的靜態變數 除常量 被final修辭的靜態變數 原因 常量一種特殊的變數,...