構造代碼塊與靜態代碼塊(靜態初始化塊)
1.構造代碼塊:每次創建對象時執行
2.靜態代碼塊(靜態初始化塊):JVM加載類(加載在運行之前)時執行,靜態代碼塊(靜態初始化塊)只執行一次
爲啥需要靜態初始化塊?
靜態初始化塊主要用來初始化類變量
類變量可以在構造函數中初始化爲啥還要定義靜態初始化塊呢?
因爲,類變量可以通過類名.類變量的形式調用,有的時候我們不想爲了初始化類變量而創建對象,所以就有了靜態初始化塊。
靜態初始化塊可以在類加載的時候執行一次。避免了了初始化類變量而創建對象
3.public static B t1 = new B()
;是類變量及引用(靜態變量及靜態引用)的初始化
4.執行順序:類變量及引用(靜態變量及靜態引用)的初始化(默認初始化或“=”顯示賦值)->靜態代碼塊(靜態初始化塊,堆默認初始化的類變量根據需要重新初始化)->main()->實例變量及引用的初始化->構造代碼塊->構造方法
例:
public class B
{
public static B t1 = new B();
public static B t2 = new B();
{
System.out.println("構造塊");
}
static
{
System.out.println("靜態塊");
}
public static void main(String[] args)
{
B t = new B();
}
}
輸出如下:
構造塊
構造塊
靜態塊
構造塊
原因
類變量及引用(靜態變量及靜態引用)的初始化(默認初始化或“=”顯示賦值)優先於靜態初始化塊(靜態塊)執行,接下來靜態初始化塊(靜態塊)按照申明順序執行,,
首先,執行public staticB t1 = newB();
該語句創建對象,則會調用構造代碼塊,輸出第一個構造塊
其次,執行public static B t2 = new B();
該語句又創建新對象,則又會調用構造代碼塊,輸出第二個構造塊
接着,再按照靜態代碼塊申明順序執行下面的靜態代碼塊:輸出靜態塊
static
{
System.out.println("靜態塊");
}
最後,main方法執行,創建對象,輸出構造塊
。