java 類初始化順序

2021-08-05 18:34:12 字數 1558 閱讀 8342

我們先來看段**

public

class

inittest

static

public

inittest(string str)

public

static

intprint(string str)

public

static

void

main(string args)

}

相信大多數同行在不執行本段**的情況都能說出程式執行的結果

2:i   i=0   n=0

3:static i=1 n=99

*****====start**********==

4:j i=2 n=100

5:creat i=3 n=101

6:init i=4 n=102

*****====end**********==

這裡先補充些基礎知識

類在載入時會先給類變數分配儲存空間並給該變數設定系統預設的預設值,然後按原始碼順序執行這些類變數的賦值語句及靜態**塊

當例項化乙個有繼承關係的子類時,其執行順序如下

1、執行父類的類變數賦值語句和靜態**塊 (此時的類變數賦值語句和靜態**塊的執行先後順序取決於它們在源**中的順序)

2、執行字類的類變數賦值語句和靜態**塊

類變數賦值語句和靜態**塊在其所屬類第一次載入時執行且僅執行一次

下面的過程發生在類例項化時

3、執行父類的例項變數賦值語句、非靜態**塊和建構函式

4、執行子類的例項變數賦值語句、非靜態**塊和建構函式

如果此時將上面**中遮蔽的兩句**放開,結果又是如何呢?

先看看執行的結果:

2:j   i=0   n=0

3:creat i=1 n=1

4:t1 i=2 n=2

5:j i=3 n=3

6:creat i=4 n=4

7:t2 i=5 n=5

8:i i=6 n=6

9:static i=7 n=99

*****====start**********==

10:j i=8 n=100

11:creat i=9 n=101

12:init i=10 n=102

*****====end**********==

通過打斷點分析**的執行步驟發現執行順序如下:

1、**執行了類變數k=1的賦值操作

2、執行類變數t1時由於類變數已經初始化一次了,故直接按類例項化的流程執行

3、執行類變數t2時同上

4、執行類變數i、n的賦值語句

5、執行靜態**塊中的語句

6、執行main方法中的例項化語句,執行例項變數的賦值語句、非靜態**塊、建構函式

參考資料:

Java類初始化順序

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

java類初始化順序

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

java類初始化順序

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