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