三 類初始化概述

2022-09-20 09:30:13 字數 1706 閱讀 9224

——萬丈高樓平地起

1、類載入、鏈結、初始化

1.1  類載入:將類的class檔案讀入記憶體,並為之建立乙個j**a.lang.class物件

1.2 類的連線:

驗證:驗證階段用於檢驗被載入的類是否有正確的內部結構,和其他類協調一致

準備:類準備階段為類的類變數分配記憶體,並設定預設初始值

解析:將類的二進位制資料中的符號引用替換成直接飲用

1.3 初始化:主要對類變數進行初始化

例:

public

class

test

public

static

int a=5;

public

static

void

main(string args)

}

對上例**解析:首先把test.j**a檔案編譯成test.class檔案(編譯用j**ac命令)。當執行(j**a命令)時,開始執行上面的步驟(首次使用該類或預載入該類)。

類載入:生成 test.class檔案讀入記憶體,並生成對應的class物件,class物件可以通過classc= test.class 方式獲取;

類連線:準備階段為類變數分配記憶體,並賦初始值。即4位元組空間給變數a使用,並且初始值a=0。(關於預設值可以查詢api或找度娘;類似j**ascript中宣告的提前,即總會把public static int a=0 放入最前面,然後執行a=1;a=5;)

初始化:初始化順序是從上往下的,即先執行a=1;然後執行a=5;所以輸出結果test.a=5

2、 類初始化時機:乙個類什麼時候會初始化

2.1 建立類例項。比如通過new 建立物件或通過反射建立物件(建立物件不僅類得到例項化,而且物件也會被例項化)。

2.2 呼叫某個類的靜態方法 或 操作靜態屬性(static修飾的)。比如上例中在main方法中呼叫test.a

2.3 使用反射建立某個類的class帝鄉,比如上例中:classc= test.class 或者 classc = class.forname("test");此時物件並未初始化,只是類初始化。

2.4 某個類被初始化時,它的父類將先被初始化。

2.5 執行main(主類)方法時。

3.1 從本地檔案系統載入class檔案。例如:平時用ide(如eclipse)工具編寫的程式,將自動編譯成class檔案,當點選執行時,便是載入的class檔案。

3.3 通過網路載入class檔案。

3.4 把乙個j**a源程式動態編譯,並執行載入。

4、jvm初始化乙個類的幾個步驟

4.1 假如這個類還沒有載入和連線,則程式先載入並連線該類

4.2 假如假如該類的直接父類還沒有被初始化,則先初始化其直接父類

4.3 假如了,類中有初始化語句,則系統依次執行這些初始化語句

當執行到3.2初始化父類時,重複3.1~3.3步驟,所以jvm最先初始化的總是j**a.lang.object類。

5、j**a的程式結束

5.1 程式執行到最後正常結束

5.2 程式執行到使用system.exit() 或者 runtime.getruntime().exit()**處

5.3 程式執行中遇到未捕獲的異常或錯誤而結束

5.4 程式所在的平台強制結束了jvm程序。比如:開啟任務管理器 ctrl+shift+esc(window7下),找到程序強制結束

備註:內容主要摘自與李剛老師的「瘋狂j**a講義」

類初始化和例項初始化

乙個類要建立例項需要先載入並初始化該類 main方法所在的類需要先載入和初始化 乙個子類要初始化需要先初始化父類 乙個類初始化就是執行clinit 方法 clinit 方法由靜態類變數顯式賦值 和靜態 塊組成 類變數顯式賦值 和靜態 塊 從上到下順序執行 clinit 方法只執行一次 父類的初始化 ...

類初始化和例項初始化

father public class father father public inttest public static intmethod son public class sonextends father son public inttest public static intmethod...

類初始化 例項初始化 方法重寫

乙個類要建立例項需要先載入並初始化該類 乙個子類要初始化需要先初始化父類 乙個類初始化就是執行 clinit 方法 例項初始化就是執行 init 方法 哪些方法不可以被重寫 物件的多型性 父類 author barrylee 2018年11月10日 下午3 52 33 public class fa...