3 類成員的載入順序

2021-10-05 22:25:02 字數 1765 閱讀 2467

初始化:給類的靜態變數賦值(在鏈結階段會賦預設值,主動使用這個類,才會初始化)

在給靜態變數賦值時,是按照循序賦值的。並不是先給靜態**塊賦值。如果靜態欄位在靜態**塊 前,會先初始化靜態字段

當子類的成員變數可以在編譯期確定時,jvm是不會初始化這個類(即不是主動引用這個類)。會將 這個常量加入 所使用該常量所在類的常量池中

public class test3 

}// 父類

class parent3

}// 子類

class child3 extends parent3}``

結果:1

理解:childvariate是可以在編譯時確定的常量。這裡jvm實際上只初始化了test3這個類,並將childvariable

加入了test3所在的類

2 .使用乙個類的靜態變數時,會初始化這個類。如果這個類有父類,也會初始化其父類

public class test1 

}class parent

}class child extends parent

}結果:

parent static block

child static block

1理解:

1.這裡和上面唯一的不同就是childvariable沒加final修飾。在test1類中 system.out.println(child.childvariate);

就是主動使用這個類(使用類的靜態變數)。因為這個類有父類,也會初始化其父類(也是主動使用這個類)

jvm就會初始化parent,和child這兩個類。

初始化循序:parentvariable賦值為2

執行靜態**塊:

輸出parent static block

childvariable賦值為1

執行靜態**塊:

輸出child static block

在在test類輸出 1

3.綜合來看類成員初始化

public class test2

}class parent

public static int parentvariate = 1;

static

}class child extends parent

public static int childvariate = 1;

static

}結果:

parent static block

parent constructor

child static block

1理解:

先載入主類:test2{} (因為有main方法,這是jvm的入口)

1):new parent();

這個**,就是主動使用paren類。jvm虛擬機會初始化parent{}這個類

a:先初始化parentvariate為1

b:執行靜態**塊,

輸出parent static block

2): parent{} 類初始化好了,就執行new語句

輸出:parent constructor

3):system.out.println(child.childvariate);

這個**,就是主動使用child類。jvm虛擬機會初始化child{}這個類

a:先初始化childvariate為1

b:執行靜態**塊,

輸出childe static block

day10 類成員載入順序

面試的時候遇到了這樣乙個問題 class apublica publica int n class bextends apublicb publicb int n public class classload 如上 當呼叫了子類b的有參構造時,父類的構造器先執行肯定是確定無疑,但是是執行哪個構造器呢...

類的載入順序

直接上 熱乎的 package test 有父類的情況 1.載入父類 1.1 為靜態屬性分配儲存空間並賦初始值 1.2 執行靜態初始化塊和靜態初始化語句 從上至下 2.載入子類 2.1 為靜態屬性分配儲存空間 2.2 執行靜態初始化塊和靜態初始化語句 從上至下 3.載入父類構造器 3.1 為例項屬性...

類的載入順序

類載入的順序 1.載入靜態成員 塊 先遞迴地載入父類的靜態成員 塊 object的最先 再依次載入到本類的靜態成員。同乙個類裡的靜態成員 塊,按寫 的順序載入 靜態 塊和靜態成員誰在前面就先載入誰 如果其間呼叫靜態方法,則呼叫時會先執行靜態方法,再繼續載入。同乙個類裡呼叫靜態方法時,可以不理會寫 的...