1. 程式人生 > >Java中的初始化塊和構造器的執行順序

Java中的初始化塊和構造器的執行順序

我們都知道java中不但有構造器,還有初始化塊和靜態初始化塊的概念,今天我們就來看看他們之間的執行順序是怎樣的。

我們來看一個例子:

package test;

class Root {
	static {
		System.out.println("Root的靜態初始化塊");
	}
	{
		System.out.println("Root的普通初始化塊");
	}

	public Root() {
		System.out.println("Root的無參構造");
	}
}

class Mid extends Root {
	static {
		System.out.println("Mid的靜態初始化塊");
	}
	{
		System.out.println("Mid的普通初始化塊");
	}

	public Mid() {
		System.out.println("Mid的無參構造");
	}

	public Mid(String name) {
		this();
		System.out.println("Mid的帶參構造器" + name);
	}
}

class Leaf extends Mid {
	static {
		System.out.println("Leaf的靜態初始化塊");
	}
	{
		System.out.println("Leaf的普通初始化塊");
	}

	public Leaf() {
		super("瘋狂java講義");
		System.out.println("Leaf的無參構造");
	}
}

public class Test {
	public static void main(String[] args) {
		new Leaf();
		new Leaf();
	}
}

該段程式碼的執行結果如下:

從程式碼執行的結果來看,我們可以知道三點:  

1.類的初始化階段,先執行最頂層的父類的靜態初始化塊,然後依次向下執行,直到執行當前類的靜態初始化塊   

2.物件初始化階段,先執行最頂層父類的初始化塊,最頂層父類的構造器,然後依次向下,直到執行當前類的初始化塊當前類的構造器。

3.當第二次建立物件時,由於這些類在第一次建立物件時已經被載入過了,因此靜態初始化塊只會執行一次。

總結一下三者的執行順序:

1.父類的靜態初始化塊

2.子類的靜態初始化塊

3.父類的初始化塊

4.父類的建構函式

5.子類的初始化塊

6.子類的建構函式