1.執行順序:
靜态構造塊 (bean初始語句之前) → (bean初始語句之後)構造塊 → 構造函數 → (bean初始化)
2.有繼承的情況
父類靜态構造快 → 子類靜态構造塊 → 父類構造塊 → 父類構造函數 → 子類構造塊 → 子類構造函數
3.必須要明白的
靜态塊:用static申明,JVM加載類時執行,僅執行一次(也就是某對象在第一次建立之後,第二次就不會執行),第一個靜态塊還沒有執行好,後面的靜态塊都不會執行
構造塊:類中直接用{}定義,每一次建立對象時執行
4.下面是一些示範,以及相關解釋
package com;
public class Hen {
String master;
public String getMaster() {
return master;
}
public void setMaster(String master) {
this.master = master;
}
static {
System.out.println("hen靜态構造塊1");
System.out.println("<<<<<<<<内部start<<<<<<<<<");
Hen hen = new Hen("内部hen");
System.out.println("<<<<<<<<内部end<<<<<<<<<");
}
{
System.out.println("hen構造塊1");
}
static {
System.out.println("hen靜态構造塊2");
}
{
System.out.println("hen構造塊2");
}
public Hen() {
super();
}
public Hen(String master) {
super();
this.master = master;
System.out.println("hen構造函數");
}
}
package com;
public class Egg extends Hen {
String master;
public String getMaster() {
return master;
}
public void setMaster(String master) {
this.master = master;
}
static {
System.out.println("egg靜态構造塊");
}
{
System.out.println("egg構造塊");
}
public Egg() {
super();
// TODO Auto-generated constructor stub
}
public Egg(String master) {
super();
this.master = master;
System.out.println("egg構造函數");
}
}
package com;
public class Main {
public static void main(String[] args) {
System.out.println("--------start------");
Hen hen1 = new Hen("hen1");
System.out.println("---------end-------");
System.out.println("--------start------");
Hen hen2 = new Hen("hen2");
System.out.println("---------end-------");
System.out.println("--------start------");
Egg egg1 = new Egg("egg1");
System.out.println("---------end-------");
System.out.println("--------start------");
Egg egg2 = new Egg("egg2");
System.out.println("---------end-------");
}
}
輸出為:
--------start------
hen靜态構造塊1
<<<<<<<<内部start<<<<<<<<<
hen構造塊1
hen構造塊2
hen構造函數
<<<<<<<<内部end<<<<<<<<<
hen靜态構造塊2
hen構造塊1
hen構造塊2
hen構造函數
---------end-------
--------start------
hen構造塊1
hen構造塊2
hen構造函數
---------end-------
--------start------
egg靜态構造塊
hen構造塊1
hen構造塊2
egg構造塊
egg構造函數
---------end-------
--------start------
hen構造塊1
hen構造塊2
egg構造塊
egg構造函數
---------end-------
相關的解釋:
遵照1,2,3,所述:
Hen hen1 = new Hen("hen1");
靜态塊僅執行一次,且最先執行,是以輸出
hen靜态構造塊1
又hen靜态快1中建立了内部的hen,第一個靜态塊還沒有執行好,是以,後面的靜态塊都不會執行,是以根據上面的執行順序,先構造塊,後構造函數,輸出為:
hen構造塊1
hen構造塊2
hen構造函數
然後繼續執行Main方法的第一個建立,輸出為:
hen靜态構造塊2
hen構造塊1
hen構造塊2
hen構造函數
因為static靜态塊隻執行一次,是以第二次建立對象的時候,輸出為:
hen構造塊1
hen構造塊2
hen構造函數
Egg繼承了Hen,但是Hen的靜态塊已經執行過了,是以跟據上面的執行順序,輸出為:
egg靜态構造塊
hen構造塊1
hen構造塊2
egg構造塊
egg構造函數
同理,再次建立時,輸出為:
hen構造塊1
hen構造塊2
egg構造塊
egg構造函數
5.參考文檔:https://blog.csdn.net/qq_42128262/article/details/89191300
https://blog.csdn.net/zzzzzztt/article/details/79839914?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task