代碼塊的執行過程

1、概念

在進入正題之前,我們首先需要知道的一個概念就是神馬纔是代碼塊。那麼神馬纔是代碼塊呢?下面給出正解。

所謂代碼塊,在Java中,就是指使用大括號{}括起來的代碼部分。

2、代碼塊的分類

關於代碼塊的分類,主要有四種:局部代碼塊、構造代碼塊、靜態代碼塊和同步代碼塊。

1)局部代碼塊

局部代碼塊是指在方法中給出的一個代碼塊,其主要作用就是用來限定變量的生命週期,及早釋放,提高內存的利用率。

2)構造代碼塊

構造代碼塊是指存在於類中方法外且被大括號{}括起來的代碼部分,其主要作用是將多個構造方法中相同部分代碼提取出來存放到了一起,使得代碼更加的簡潔。該代碼塊在每次調用構造方法時都會執行,並且在構造方法前執行。

3)靜態代碼塊

靜態代碼塊是指存在於類中方法外且被大括號{}括起來的代碼部分,與構造代碼塊不同的是,該代碼塊在大括號{}前加上了一個static修飾符,用以表示該代碼塊是一個靜態代碼塊。該代碼塊主要用於給類進行初始化,在類加載的時候執行,並且只執行一次。

4)同步代碼塊(主要用於多線程中)

3、代碼塊執行過程

上面已經對不同代碼塊的分類做了一個簡單的介紹,下面接着對代碼塊的執行過程的分析。

3.1 簡單執行過程分析

首先給出測試代碼和運行結果。

測試代碼:

class Student {
	static{
		System.out.println("Student靜態代碼塊.");
	}
	
	{
		System.out.println("Studen構造代碼塊.");
	}
	
	public Student(){
		System.out.println("Student構造方法.");
	}
}

public class Test {
	static{
		System.out.println("Test主類靜態代碼塊.");
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("我是main方法.");
		Student stu = new Student();
		Student stu2 = new Student();

	}

}


運行結果:


根據執行結果我們可以看到,Student的靜態代碼塊只執行了一次,而構造代碼塊執行了兩次,且每次都優先於構造方法執行。其原因是因爲靜態代碼塊只在首次創建實例對象,將字節碼加載到方區內存中靜態區時調用,之後不再調用。

3.2 繼承關係中的執行過程

同樣的首先給出測試代碼和運行結果。

測試代碼:

class Father{
	static{
		System.out.println("靜態代碼塊Father.");
	}
	{
		System.out.println("構造代碼塊Father.");
	}
	public Father(){
		System.out.println("構造方法Father.");
	}
}

class Son extends Father{
	static{
		System.out.println("靜態代碼塊Son.");
	}
	{
		System.out.println("構造代碼塊Son.");
	}
	public Son(){
		System.out.println("構造方法Son.");
	}
}
public class Test {
	public static void main(String[] args) {
		Son son = new Son();
	}

}


運行結果:



根據運行結果我們可以看到,當子父類中都有靜態代碼塊、構造代碼塊、構造方法時,它們的執行流程是:1)父類靜態代碼塊;2)子類靜態代碼塊;3)父類構造代碼塊;4)父類構造方法;5)子類構造代碼塊;6)子類構造方法。

具體分析:

當在main方法中執行” Son son = new Son(); “語句時,就會去加載Son進入內存,因爲Son繼承於Father類,所以Father將優先於Son被加載。在將Father、Son兩個類的字節碼加載進方法區內存中時其對應的靜態代碼塊也將會依次得到執行,這就是爲什麼一開始輸出”靜態代碼塊Father.”、”靜態代碼塊Son.“的原因。緊接着執行Son的空參構造方法進行初始化,又由於構造方法內部默認存在super()方法對其父類Father進行空參構造方法的調用,所以接着輸出的是”構造代碼塊Father.“、”構造方法Father.“,其次纔是”構造代碼塊Son.“、”構造方法Son.“。

以上就是對Java中代碼塊執行過程的一個簡單分析,有啥疏漏歡迎補充。



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