阿里巴巴程式筆試題及答案

來源:果殼範文吧 2.13W

【問題】如果類A和類B中有靜態變數,靜態語句塊,非靜態變數,非靜態語句塊,建構函式,靜態方法,非靜態方法,同時類A繼承類B,請問當例項化A時,類內部的載入順序是什麼?

 【解析】測試程式碼如下:

Class B:

public class B{//靜態變數static int i=1;//靜態語句塊static {tln("Class B1:static blocks"+i);}//非靜態變數int j=1;//靜態語句塊static{i++;tln("Class B2:static blocks"+i);}//建構函式public B(){i++;j++;tln("constructor B: "+"i="+i+",j="+j);}//非靜態語句塊{ i++; j++; tln("Class B:common blocks"+"i="+i+",j="+j);}//非靜態方法public void bDisplay(){i++;tln("Class B:static void bDisplay():"+"i="+i+",j="+j);return ;}//靜態方法public static void bTest(){i++;tln("Class B:static void bTest():"+"i="+i);return ;}}

Class A:

public class A extends B{//靜態變數static int i=1;//靜態語句塊static {tln("Class A1:static blocks"+i);}//非靜態變數int j=1;//靜態語句塊static{i++;tln("Class A2:static blocks"+i);}//建構函式public A(){ super();i++;j++;tln("constructor A: "+"i="+i+",j="+j);}//非靜態語句塊{ i++; j++; tln("Class A:common blocks"+"i="+i+",j="+j);}//非靜態方法public void aDisplay(){i++;tln("Class A:static void aDisplay():"+"i="+i+",j="+j);return ;}//靜態方法public static void aTest(){i++;tln("Class A:static void aTest():"+"i="+i);return ;}}

Class ClassLoading :

public class ClassLoading {public static void main (String args[]) {A a=new A();play();}}

  程式執行結果如圖:

阿里巴巴程式筆試題及答案

  通過上述示圖,我們可以比較清晰的看出java類的整個載入過程:

1.若要載入類A,則先載入執行其父類B(Object)的靜態變數以及靜態語句塊(執行先後順序按排列的先後順序)。

2.然後再載入執行類A的靜態變數以及靜態語句塊。(並且1、2步驟只會執行1次)

3.若需例項化類A,則先呼叫其父類B的建構函式,並且在呼叫其父類B的建構函式前,依次先呼叫父類B中的非靜態變數及非靜態語句塊.最後再呼叫父類B中的建構函式初始化。

4.然後再依次呼叫類A中的非靜態變數及非靜態語句塊.最後呼叫A中的建構函式初始化。( 並且3、4步驟可以重複執行)

5.而對於靜態方法和非靜態方法都是被動呼叫,即系統不會自動呼叫執行,所以使用者沒有呼叫時都不執行,主要區別在於靜態方法可以直接用類名直接呼叫(例項化物件也可以),而非靜態方法只能先例項化物件後才能呼叫。

熱門標籤