【碼農每日一題】Java 中代碼塊相關筆試題

問:Java 代碼塊是什麼?代碼塊的分類有哪些?作用是什麼?

 

答:所謂代碼塊就是用大括號 {} 將多行代碼封裝在一起形成一個獨立的數據體,用於實現特定的需求,一般來說代碼塊是不能單獨運行的,它必須要有運行主體。

 

普通代碼塊(局部代碼快)是在方法名後面用 {} 括起來的代碼段,不能夠單獨存在,必須要緊跟在方法名後面且必須使用方法名調用它,作用是限定變量的生命週期和提高效率。

 

構造代碼塊是在類中方法外用 {} 括起來的代碼,作用是把所有構造方法中相同的內容抽取出來,將來在調用構造方法的時候會去自動調用構造代碼塊,構造代碼快優先於構造方法。

 

靜態代碼塊是在類中方法外用 {} 括起來且添加了 static 前綴修飾的代碼,作用是隨着類的加載而加載且只加載一次。

 

同步代碼塊是方法中使用 synchronized 關鍵字修飾並使用 {} 括起來的代碼片段,表示同一時間只能有一個線程進入到該代碼塊中,作用是一種多線程併發保護機制。

 

 

問:Java 中靜態代碼塊、構造代碼塊、構造方法的執行順序是什麼?

 

答:因爲靜態代碼塊作用於類級別,構造代碼塊和構造方法作用於對象級別,所以靜態代碼塊是隨着類的加載而被執行,只要類被加載了就會執行,而且只會加載一次,主要用於給類進行初始化;構造代碼塊在每次創建一個對象時就會執行一次且優先於構造函數,主要用於初始化不同對象共性的初始化內容和初始化實例環境;構造方法在每次創建一個對象時就會執行一次,同時構造方法是給特定對象進行初始化,而構造代碼是給所有對象進行初始化;所以通過分析得出他們三者的執行順序爲 靜態代碼塊 > 構造代碼塊 > 構造方法。

 

 

問:下面代碼第一次運行的結果是什麼?


 
  1. class BaseTmp {  

  2.    BaseTmp() {  

  3.        System.out.println("BaseTmp instance.");  

  4.    }  

  5. }

  6.  

  7.  

  8. class Base {  

  9.    BaseTmp tmp = new BaseTmp();

  10.  

  11.  

  12.    static {  

  13.        System.out.println("Base static{}.");  

  14.    }

  15.  

  16.  

  17.    Base() {  

  18.        System.out.println("Base instance.");  

  19.    }  

  20. }

  21.  

  22.  

  23. class BaseChild extends Base {  

  24.    BaseTmp tmp = new BaseTmp();

  25.  

  26.  

  27.    static {  

  28.        System.out.println("BaseChild static{}.");  

  29.    }

  30.  

  31.  

  32.    BaseChild() {  

  33.        System.out.println("BaseChild instance.");  

  34.    }  

  35. }

  36.  

  37.  

  38. public class Demo {

  39.    public static void main(String argv[]) {

  40.        new BaseChild();

  41.    }        

  42. }

  43.  

 

答:如上代碼段的運行結果如下。

Base static{}.

BaseChild static{}.

BaseTmp instance.

Base instance.

BaseTmp instance.

BaseChild instance.

 

首先程序加載了 Demo 類進來,接着執行 Demo 類中程序的入口 main 方法,在 main 方法中我們創建了 BaseChild 實例,而第一次創建 BaseChild 實例前需要先把 BaseChild 類加載進來,而 BaseChild 又繼承自 Base 類,所以要加載 BaseChild 得先加載 Base 類,在加載 Base 類時由於 Base 類中有一個靜態代碼塊,所以會先執行打印 Base static{}.,接着加載了 BaseChild 類執行了其中的靜態代碼塊打印爲 BaseChild static{}.,當類加載完成以後就開始實例化階段了,實例化 BaseChild 對象之前得先實例化 Base 對象(因爲子類構造方法會調用父類構造方法,所以得先實例化父類),實例化 Base 對象前還得先初始化(即獲取類的屬性並初始化),所以 Base 類中 BaseTmp 屬性先被實例化,所以打印 BaseTmp instance.,接着執行 Base 類的構造方法打印 Base instance.,然後回退到子類也是先初始化然後實例化,同理打印 BaseTmp instance. 和 BaseChild instance.。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章