java類初始化順序

2021-08-03 10:27:04 字數 1499 閱讀 3297

我們大家都知道,對於靜態變數、靜態初始化塊、變數、初始化塊、構造器,它們的初始化順序依次是(靜態變數、靜態初始化塊)>(變數、初始化塊)>構造器。我們也可以通過下面的測試**來驗證這一點: 

public

class initialordertest    

// 初始化塊 

// 構造器 

public initialordertest()    

public

static

void main(string args)    

}  

執行以上**,我們會得到如下的輸出結果: 

靜態變數

靜態初始化塊

變數初始化塊

構造器

這與上文中說的完全符合。那麼對於繼承情況下又會怎樣呢?我們仍然以一段測試**來獲取最終結果: 

class parent    

// 初始化塊 

// 構造器 

public parent()    

}   

public

class subclass extends parent    

// 初始化塊 

// 構造器 

public subclass()    

// 程式入口 

public

static

void main(string args)    

}  

執行一下上面的**,結果馬上呈現在我們的眼前: 

父類--靜態變數

父類--靜態初始化塊

子類--靜態變數

子類--靜態初始化塊

父類--變數

父類--初始化塊

父類--構造器

子類--變數

子類--初始化塊

子類--構造器

現在,結果已經不言自明了。大家可能會注意到一點,那就是,並不是父類完全初始化完畢後才進行子類的初始化,實際上子類的靜態變數和靜態初始化塊的初始化是在父類的變數、初始化塊和構造器初始化之前就完成了。 

那麼對於靜態變數和靜態初始化塊之間、變數和初始化塊之間的先後順序又是怎樣呢?是否靜態變數總是先於靜態初始化塊,變數總是先於初始化塊就被初始化了呢?實際上這取決於它們在類中出現的先後順序。我們以靜態變數和靜態初始化塊為例來進行說明。 

同樣,我們還是寫乙個類來進行測試: 

public

class testorder    

// 靜態變數 

public

static testb b = new testb();   

public

static

void main(string args)    

}   

class testa    

}   

class testb    

}  

執行上面的**,會得到如下的結果: 

test--a

靜態初始化塊

test--b

Java類初始化順序

類的初始化順序 首先執行父類靜態的內容,父類靜態的內容執行完畢後,接著去執行子類的靜態的內容,當子類的靜態內容執行完畢之後,再去看父類有沒有非靜態 塊,如果有就執行父類的非靜態 塊,父類的非靜態 塊執行完畢,接著執行父類的構造方法 父類的構造方法執行完畢之後,它接著去看子類有沒有非靜態 塊,如果有就...

java類初始化順序

我們大家都知道,對於靜態變數 靜態初始化塊 變數 初始化塊 構造器,它們的初始化順序依次是 靜態變數 靜態初始化塊 變數 初始化塊 構造器。我們也可以通過下面的測試 來驗證這一點 public class initialordertest 初始化塊 構造器 public initialorderte...

java 類初始化順序

我們先來看段 public class inittest static public inittest string str public static intprint string str public static void main string args 相信大多數同行在不執行本段 的情況...