當前位置:學問谷 >

職場範例 >筆試 >

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

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

【問題】如果類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.而對於靜態方法和非靜態方法都是被動調用,即系統不會自動調用執行,所以用户沒有調用時都不執行,主要區別在於靜態方法可以直接用類名直接調用(實例化對象也可以),而非靜態方法只能先實例化對象後才能調用。

  • 文章版權屬於文章作者所有,轉載請註明 https://xuewengu.com/flzc/bishi/0vn5v4.html