一個關於java構造塊、構造方法、靜態塊、繼承的面試題
阿新 • • 發佈:2018-11-10
看下面一段程式碼,求執行順序:
class A { public A() { System.out.println("1A類的構造方法"); } { System.out.println("2A類的構造快"); } static { System.out.println("3A類的靜態塊"); } } public class B extends A { public B() { System.out.println("4B類的構造方法"); } { System.out.println("5B類的構造快"); } static { System.out.println("6B類的靜態塊"); } public static void main(String[] args) { System.out.println("7"); new B(); new B(); System.out.println("8"); } }
執行順序結果為:367215421548
為什麼呢?
首先我們要知道下面這5點:
- 每次new都會執行構造方法以及構造塊。
- 構造塊的內容會在構造方法之前執行。
- 非主類的靜態塊會在類載入時,構造方法和構造塊之前執行,切只執行一次。
- 主類(public class)裡的靜態塊會先於main執行。
- 繼承中,子類例項化,會先執行父類的構造方法,產生父類物件,再呼叫子類構造方法。
所以題目裡,由於主類B繼承A,所以會先載入A,所以第一個執行的是第3句。
從第4點我們知道6會在7之前執行,所以前三句是367。
之後例項化了B兩次,每次都會先例項化他的父類A,然後再例項化B,而根據第1、2、5點,知道順序為2154。
最後執行8
所以順序是367215421548