JVM筆記 06類從上到下的初始化順序

2021-10-16 09:10:35 字數 2471 閱讀 7795

jvm筆記 - 01類載入器深入解析與階段分解

jvm筆記 - 02類的載入、連線、始化過程詳解

前面兩篇內容,介紹了類的載入、連線、初始化,及主動使用類的場景。

靜態變數counter2的宣告賦值,在構造方法前面

package com.test;

public

class

mytest6

}class

singleton

public

static singleton getinstance()

}

執行結果為:

執行結果分析:

① main()方法中,"singleton.getinstance()"呼叫了singleton的靜態方法,是對singleton的主動使用

public

class

mytest6

}

② 對singleton的主動使用,會初始化singleton。

在初始化singleton之前,會先載入、連線singleton

③ 連線singleton,具體分為3個步驟:驗證 -> 準備 -> 解析

④ 在連線的準備階段,為會singleton的靜態變數分配記憶體,並將靜態變數初始化為預設值。

準備階段完成後,singleton的靜態變數的狀態如下

//int的預設值為0

counter1 =0;

counter2 =0;

//引用型別的預設值為null

singleton = null;

⑤ 在初始化階段,會為singleton的靜態變數賦予正確的初始值。

初始化的順序,就是**編寫的順序。

class

singleton

}

第1步,初始化counter1,因為**中沒有為counter1設定具體的數值,所以counter1的值仍然是準備階段的預設值,即0

第2步,初始化counter2,因為**中給counter2賦值為0,所以counter2的值是**中設定的值,即0

第3步,初始化singleton,初始化singleton會執行建構函式。

在建構函式中,對counter1、counter2分別進行了自增1的操作,所以建構函式執行完成後,counter1值有0變為了1、counter2的值由0變為了1

⑥ 所以,main()方法中,列印counter1、counter2的值,得到的結果分別為 counter1 = 1,counter2 = 1

靜態變數counter2的宣告賦值,在構造方法後面

package com.test;

public

class

mytest6

}class

singleton

//在建構函式的後面

public

static

int counter2 =0;

public

static singleton getinstance()

}

執行結果為:

執行結果分析:

①、②、③、④,案例1和案例2是相同的

⑤ 在初始化階段,會為singleton的靜態變數賦予正確的初始值。

初始化的順序,就是**編寫的順序。

class

singleton

//在建構函式的後面

public

static

int counter2 =0;

public

static singleton getinstance()

}

第1步,初始化counter1,因為**中沒有為counter1設定具體的數值,所以counter1的值仍然是準備階段的預設值,即0

第2步,初始化singleton,初始化singleton會執行建構函式。

在建構函式中,對counter1、counter2分別進行了自增1的操作,所以建構函式執行完成後,counter1值由0變為了1、counter2的值由0變為了1

第3步,初始化counter2,因為**中給counter2賦值為0,所以counter2的值是**中設定的值,即0。

因為counter2的位置在建構函式的後面,

所以在執行建構函式後,counter2 = 1,在counter2初始化完成後,counter2 = 0

⑥ 所以,main()方法中,列印counter1、counter2的值,得到的結果分別為 counter1 = 1,counter2 = 0

JVM 五 類的初始化

7種主動使用和被動使用,會觸發類的初始化 當初始化類的時候,要求父類都已經被初始化,但是這條規則不適用於介面 inte ce public class test06 inte ce threadparent class threadchild implements threadparent在這個例子...

構造方法 類的初始化塊以及類字段的初始化順序

首先,以下 為何無法通過編譯?哪兒出錯了?public class test class foo 如果類提供了乙個自定義的構造方法,將導致系統不再提供預設構造方法。如果乙個類中既有初始化塊,又有構造方法,同時還設定了字段的初始值,誰說了算?class initializeblockclass pub...

非靜態類的靜態成員與非靜態成員的初始化順序

先執行下面一段 public class spooler static spooler public static spooler getspooler else public void print public static void printstatic 1.我們在用 spooler s ne...