所謂的代碼塊就是一段獨立的代碼空間软驰,那什么是靜態(tài)代碼塊呢涧窒?說白了,靜態(tài)代碼塊就是用static修飾的代碼塊锭亏,關(guān)于靜態(tài)代碼塊的概念不多說纠吴,不過你需要知道它的一個特點,那就是
隨著類的加載而執(zhí)行慧瘤,而且只執(zhí)行一次
用代碼驗證靜態(tài)代碼塊隨著類的加載而執(zhí)行戴已,且執(zhí)行一次
class StaticDemo{
//靜態(tài)代碼塊
static {
System.out.println("靜態(tài)代碼塊被執(zhí)行");
}
void show(){
System.out.println("方法被執(zhí)行");
}
}
public class StaticTest {
/**
- 靜態(tài)代碼塊的特點:
- 隨著類的加載而執(zhí)行固该,而且只執(zhí)行一次
*/
public static void main(String[] args){
new StaticDemo().show();
new StaticDemo().show();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
執(zhí)行結(jié)果如下
由輸出結(jié)果我們可以看見,最先被打印的是靜態(tài)代碼塊的輸出內(nèi)容糖儡,這就說明在加載類的時候是先執(zhí)行了靜態(tài)代碼塊的內(nèi)容伐坏,隨后調(diào)用了類中的方法,當(dāng)再次創(chuàng)建實例調(diào)用方法的時候只有方法被調(diào)用了握联,而靜態(tài)代碼塊不再執(zhí)行斤讥,因此戚宦,靜態(tài)代碼塊的特點是隨著類的加載而執(zhí)行,而且只執(zhí)行一次岳掐!
與main函數(shù)的執(zhí)行順序
其實猜也猜得到靜態(tài)代碼塊是先于main函數(shù)執(zhí)行的鉴竭,不過始終是眼見為實静陈,讓我們來用代碼驗證一下吧退子!
public class StaticTest {
/**
- 靜態(tài)代碼塊的特點:
- 隨著類的加載而執(zhí)行瘸味,而且只執(zhí)行一次
- 靜態(tài)代碼塊的執(zhí)行順序優(yōu)先于main函數(shù)
*/
static {
System.out.println("a");
}
public static void main(String[] hq){
System.out.println("b");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
我們看執(zhí)行結(jié)果,輸出如下
代碼驗證結(jié)果依然是靜態(tài)代碼塊優(yōu)先于main函數(shù)執(zhí)行蜒犯,其實這是必然的组橄,因為靜態(tài)代碼塊是隨著類的加載而執(zhí)行。
為了讓你我都更明白靜態(tài)代碼塊的執(zhí)行情況罚随,接下來我們來一個稍微復(fù)雜點的,我們看看在繼承當(dāng)中的情況羽资,代碼如下
class StaticDemo{
//靜態(tài)代碼塊
static {
System.out.println("父類靜態(tài)代碼塊被執(zhí)行");
}
void show(){
System.out.println("父類方法被執(zhí)行");
}
}
public class StaticTest extends StaticDemo {
/**
- 靜態(tài)代碼塊的特點:
- 隨著類的加載而執(zhí)行淘菩,而且只執(zhí)行一次
- 靜態(tài)代碼塊額執(zhí)行順序優(yōu)先于main函數(shù)
*/
static {
System.out.println("子類靜態(tài)代碼塊被執(zhí)行");
}
void show(){
System.out.println("子類方法被執(zhí)行");
}
public static void main(String[] hq){
System.out.println("main函數(shù)");
StaticTest staticTest = new StaticTest();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
我們先來看以上代碼,你能猜出以上代碼的運行結(jié)果是什么嗎屠升?還是先看下結(jié)果吧
和你想的一樣嗎潮改?我們知道靜態(tài)代碼塊的加載是隨著類的加載而執(zhí)行,當(dāng)執(zhí)行main函數(shù)之前腹暖,StaticTest這個類被加載汇在,而這個類又是繼承自StaticDemo,因此會最先執(zhí)行StaticDemo中的靜態(tài)代碼塊脏答,然后再執(zhí)行StaticTest中的靜態(tài)代碼塊糕殉,最后再執(zhí)行main函數(shù)中的輸出語句。
接下來我們再加上構(gòu)造方法和非靜態(tài)代碼塊殖告,接下來的代碼希望你能經(jīng)嘲⒌看看,那么靜態(tài)代碼塊這塊就足夠了黄绩。
class StaticDemo{
//靜態(tài)代碼塊
static {
System.out.println("父類靜態(tài)代碼塊被執(zhí)行");
}
//非靜態(tài)代碼塊
{
System.out.println("父類非靜態(tài)代碼塊被執(zhí)行");
}
//構(gòu)造方法
StaticDemo(){
System.out.println("父類構(gòu)造方法被執(zhí)行");
}
}
public class StaticTest extends StaticDemo {
/**
- 靜態(tài)代碼塊的特點:
- 隨著類的加載而執(zhí)行羡洁,而且只執(zhí)行一次
- 靜態(tài)代碼塊額執(zhí)行順序優(yōu)先于main函數(shù)
*/
static {
System.out.println("子類靜態(tài)代碼塊被執(zhí)行");
}
//非靜態(tài)代碼塊
{
System.out.println("子類非靜態(tài)代碼塊被執(zhí)行");
}
StaticTest(){
System.out.println("子類構(gòu)造方法被執(zhí)行");
}
public static void main(String[] hq){
System.out.println("main函數(shù)");
new StaticTest();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
你猜猜以上代碼執(zhí)行之后的輸出結(jié)果是什么?我們來看最終的運行結(jié)果
總結(jié)
通過以上輸出我們能總結(jié)出什么呢爽丹?
總結(jié):靜態(tài)代碼塊會隨著類的加載而執(zhí)行筑煮,而且只執(zhí)行一次辛蚊。當(dāng)new StaticTest()開始執(zhí)行的時候會先去執(zhí)行父類中的靜態(tài)代碼塊,然后再執(zhí)行子類中的靜態(tài)代碼塊真仲,當(dāng)所有的靜態(tài)代碼塊都執(zhí)行結(jié)束后會執(zhí)行main函數(shù)中的輸出語句(前提是輸出語句在new StaticTest()之前)嚼隘,然后會去執(zhí)行父類中的非靜態(tài)代碼塊,接著是父類中的構(gòu)造方法袒餐,緊接著執(zhí)行子類中的非靜態(tài)代碼塊飞蛹,最后是子類中的構(gòu)造方法,完事灸眼!