Java筆記(二) 代碼塊 & 類初始化順序

首先先看幾個定義及結論:

  • 靜態代碼塊:用staitc聲明,jvm加載類時執行,僅執行一次
  • 構造代碼塊:類中直接用{}定義,每一次創建對象時執行。
  • 執行順序優先級:靜態塊,main(),構造塊,構造方法

構造函數

  1. 對象一建立,就會調用與之相應的構造函數,也就是說,不建立對象,構造函數時不會運行的。
  2. 構造函數的作用是用於給對象進行初始化。
  3. 一個對象建立,構造函數只運行一次,而一般方法可以被該對象調用多次
  4. 如果類中提供了至少一個構造器,但是沒有提供無參數的構造器,則在構造對象時如果沒有提供參數則會被視爲不合法。僅當類沒有提供任何構造器時,系統纔會提供默認的構造器

構造代碼塊

{//構造代碼塊    
}
  1. 構造代碼塊的作用是給對象進行初始化。
  2. 對象一建立就運行構造代碼塊了,而且優先於構造函數執行。這裏要強調一下,有對象建立,纔會運行構造代碼塊,類不能調用構造代碼塊的,而且構造代碼塊與構造函數的執行順序是前者先於後者執行
  3. 構造代碼塊與構造函數的區別是:構造代碼塊是給所有對象進行統一初始化,而構造函數是給對應的對象初始化,因爲構造函數是可以多個的,運行哪個構造函數就會建立什麼樣的對象,但無論建立哪個對象,都會先執行相同的構造代碼塊。也就是說,構造代碼塊中定義的是不同對象共性的初始化內容。
  4. 這種機制不是必需的,也不是常見的,通常會直接將初始化代碼放到構造器中。

靜態代碼塊

  1. 它是隨着類的加載而執行,只執行一次,並優先於主函數。具體說,靜態代碼塊是由類調用的。類調用時,先執行靜態代碼塊,然後才執行主函數的。
  2. 靜態代碼塊其實就是給類初始化的,而構造代碼塊是給對象初始化的
  3. 靜態代碼塊中的變量是局部變量,與普通函數中的局部變量性質沒有區別。
  4. 一個類中可以有多個靜態代碼塊

Java類初始化順序

public class HelloA {
    public HelloA(){//構造函數
        System.out.println("A的構造函數");    
    }
    {//構造代碼塊
        System.out.println("A的構造代碼塊");    
    }
    static {//靜態代碼塊
        System.out.println("A的靜態代碼塊");        
    }
}
public static void main(String[] args) {
    }
//輸出 A的靜態代碼塊
 public static void main(String[] args) {
        HelloA a=new HelloA();    
    } 
//A的靜態代碼塊
//A的構造代碼塊
//A的構造函數
 public static void main(String[] args) {
        HelloA a=new HelloA();
        HelloA b=new HelloA();
    }
A的靜態代碼塊
A的構造代碼塊
A的構造函數
A的構造代碼塊
A的構造函數
  • 對於靜態變量、靜態初始化塊、變量、初始化塊、構造器,它們的初始化順序依次是

    ​ (靜態變量、靜態初始化塊)>(變量、初始化塊)>構造器。

  • 當涉及到繼承時,按照如下順序執行:

  1. 執行父類的靜態代碼塊,並初始化父類靜態成員變量
  2. 執行子類的靜態代碼塊,並初始化子類靜態成員變量
  3. 執行父類的構造代碼塊,執行父類的構造函數,並初始化父類普通成員變量
  4. 執行子類的構造代碼塊, 執行子類的構造函數,並初始化子類普通成員變量
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章