1. 程式人生 > >一個關於java構造塊、構造方法、靜態塊、繼承的面試題

一個關於java構造塊、構造方法、靜態塊、繼承的面試題

看下面一段程式碼,求執行順序:

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點:

  1. 每次new都會執行構造方法以及構造塊
  2. 構造塊的內容會在構造方法之前執行。
  3. 非主類的靜態塊會在類載入時,構造方法構造塊之前執行,切只執行一次。
  4. 主類(public class)裡的靜態塊會先於main執行。
  5. 繼承中,子類例項化,會先執行父類的構造方法,產生父類物件,再呼叫子類構造方法。

所以題目裡,由於主類B繼承A,所以會先載入A,所以第一個執行的是第3句。

從第4點我們知道6會在7之前執行,所以前三句是367。

之後例項化了B兩次,每次都會先例項化他的父類A,然後再例項化B,而根據第1、2、5點,知道順序為2154。

最後執行8

所以順序是367215421548