初始化:給類的靜態變數賦值(在鏈結階段會賦預設值,主動使用這個類,才會初始化)
在給靜態變數賦值時,是按照循序賦值的。並不是先給靜態**塊賦值。如果靜態欄位在靜態**塊 前,會先初始化靜態字段
當子類的成員變數可以在編譯期確定時,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的最先 再依次載入到本類的靜態成員。同乙個類裡的靜態成員 塊,按寫 的順序載入 靜態 塊和靜態成員誰在前面就先載入誰 如果其間呼叫靜態方法,則呼叫時會先執行靜態方法,再繼續載入。同乙個類裡呼叫靜態方法時,可以不理會寫 的...