java中靜態初始化塊、初始化塊和構造方法的理解

在Java中,有兩種初始化塊:靜態初始化塊和非靜態初始化塊。它們都是定義在類中,用大括號{}括起來,靜態代碼塊在大括號外還要加上static關鍵字。

非靜態初始化塊(構造代碼塊):
作用:給對象進行初始化。對象一建立就運行,且優先於構造函數的運行。
與構造函數的區別:非靜態初始化塊給所有對象進行統一初始化,構造函數只給對應對象初始化。
應用:將所有構造函數共性的東西定義在構造代碼塊中。

靜態初始化塊:
作用:給類進行初始化。隨着類的加載而執行,且只執行一次
與構造代碼塊的區別:
1)構造代碼塊用於初始化對象,每創建一個對象就會被執行一次;靜態代碼塊用於初始化類,隨着類的加載而執行,不管創建幾個對象,都只執行一次。
2)靜態代碼塊優先於構造代碼塊的執行
3)都定義在類中,一個帶static關鍵字,一個不帶static

構造函數、非靜態初始化塊、靜態代碼塊都是用於初始化,三者的執行順序依次是:靜態代碼塊>構造代碼塊>構造函數。
其實初始化塊就是構造器的補充,初始化塊是不能接收任何參數的,定義的一些所有對象共有的屬性、方法等內容時就可以用初始化塊初始化了。

靜態初始化塊的作用就是當JVM在裝載類時,你想讓它做一些事情,那麼,就可以用靜態初始化塊。這幾者的執行順序是:

(JVM在裝載類時)先裝載類的靜態成員,再執行靜態初始化塊(同樣,當一個類有繼承自某類時,則會先裝載該父類,那麼,父類的裝載或執行順序,也都如句子所述)。

(在創建類的實例時)先執行實例初始化塊,再執行構造方法;但對於一棵繼承樹中,會先調用父類的構造方法,那麼其執行順序也如句子所述。

例子:
Class A{ int n = 0;}
那麼你創建對象 A a = new A();之後就可以使用a.n屬性

Class A{ { int a= 0; } }
放在塊裏面n就不是A的成員,就不能使用a.n屬性

前者把n作爲對象的成員;後者只是實例化一個對象時聲明一個局部變量a。有本質區別。

public class Test {
static {
System.out.println(“我是靜態塊”);
}
}
當創建Test 類的一個對象的時候,比如new Test() ,是這樣,首先是類加載,然後才能new對象,靜態塊在類加載的時候就執行了,這就說明靜態塊在new對象之前就會執行,而且一個類在第一次被使用的時候 會被加載,然後在整個應用程序的生命週期當中不會再次被加載了,就加載這一次,所以這就說明,靜態塊就執行一次,不會執行第二遍!

發佈了4 篇原創文章 · 獲贊 17 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章