Java類初始化時(shí)機(jī)測(cè)試方法解析
<clinit>()方法
Java 類加載的初始化過(guò)程中,編譯器按語(yǔ)句在源文件中出現(xiàn)的順序,依次自動(dòng)收集類中的所有類變量的賦值動(dòng)作和靜態(tài)代碼塊中的語(yǔ)句合并產(chǎn)生方法。 如果類中沒(méi)有靜態(tài)語(yǔ)句和靜態(tài)代碼塊,那可以不生成<clinit>() 方法。
并且 <clinit>() 不需要顯式調(diào)用父類(接口除外,接口不需要調(diào)用父接口的初始化方法,只有使用到父接口中的靜態(tài)變量時(shí)才需要調(diào)用)的初始化方法 <clinit>(),虛擬機(jī)會(huì)保證在子類的 <clinit>() 方法執(zhí)行之前,父類的 <clinit>() 方法已經(jīng)執(zhí)行完畢(所以java.lang.Object 類總是第一個(gè)被加載)

準(zhǔn)備父類和子類
class Father {
static int father_a = 1;
static {
System.out.println("父類靜態(tài)代碼塊執(zhí)行");
}
static class StaticInnerClass {
static {
System.out.println("靜態(tài)內(nèi)部類靜態(tài)代碼塊執(zhí)行");
}
}
}
class Son extends Father {
static {
System.out.println("子類靜態(tài)代碼塊執(zhí)行");
son_a = 300;
}
static int son_a = 100;
static final int M = 1;
}
Main方法:
1:父類沒(méi)有被引用但是會(huì)被先加載
new Son();

2:反射也會(huì)產(chǎn)生主動(dòng)引用:
Class a = Class.forName("clinit.Son");
(運(yùn)行結(jié)果同1)
3:子類使用父類靜態(tài)變量或方法不會(huì)產(chǎn)生類的引用
System.out.println("Father.a = " + Son.father_a);

4:通過(guò)類創(chuàng)建數(shù)組不會(huì)加載類(只是開(kāi)辟一塊空間)
Son[] sons = new Son[8];

5:使用常量不會(huì)加載父類和之類(常量在Linking階段就保存在常量池當(dāng)中了)
System.out.println("Son.CONST = " + Son.CONST);

6:引用靜態(tài)內(nèi)部類不會(huì)加載外部類(應(yīng)用于單例模式)
new Father.StaticInnerClass();

代碼總結(jié):
public static void main(String[] args) throws Exception {
// 1.父類沒(méi)有被引用但是會(huì)被先加載
// new Son();
// 2.反射會(huì)產(chǎn)生主動(dòng)引用
// Class a = Class.forName("clinit.Son");
// 3.子類使用父類靜態(tài)變量或方法不會(huì)產(chǎn)生類的引用
// System.out.println("Father.a = " + Son.father_a);
// 4.通過(guò)類創(chuàng)建數(shù)組不會(huì)加載類(只是開(kāi)辟一塊空間)
// Son[] sons = new Son[8];
// 5.使用常量不會(huì)加載父類和之類(常量在Linking階段就保存在常量池當(dāng)中了)
// System.out.println("Son.CONST = " + Son.CONST);
// 6.引用靜態(tài)內(nèi)部類不會(huì)加載外部類(應(yīng)用于單例模式)
// new Son.StaticInnerClass();
}
}
PS:由于是按出現(xiàn)的順序執(zhí)行的,為了避免不必要的麻煩,應(yīng)盡量把靜態(tài)變量寫在靜態(tài)代碼塊之前
public class Test {
public static void main(String[] args) {
System.out.println("a = " + cls.a);
}
}
class cls {
static int a = 10;8 static { a = 20; }9 }

如果 調(diào)換順序輸出結(jié)果將是 a = 10
class cls {
static { a = 20; }
static int a = 10;
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java使用Spring JdbcTemplate向in語(yǔ)句中傳遞參數(shù)的教程詳解
這篇文章主要給大家介紹Java如何使用Spring JdbcTemplate向in語(yǔ)句中傳遞參數(shù),文中有詳細(xì)的流程步驟和代碼示例,需要的朋友可以參考下2023-07-07
Java棧之鏈?zhǔn)綏4鎯?chǔ)結(jié)構(gòu)的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java棧之鏈?zhǔn)綏4鎯?chǔ)結(jié)構(gòu)的實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-04-04
JavaWeb開(kāi)發(fā)實(shí)現(xiàn)備忘錄
這篇文章主要為大家詳細(xì)介紹了JavaWeb開(kāi)發(fā)實(shí)現(xiàn)備忘錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
Java對(duì)象深復(fù)制與淺復(fù)制實(shí)例詳解
這篇文章主要介紹了 Java對(duì)象深復(fù)制與淺復(fù)制實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05
Java System.getProperty()-獲取系統(tǒng)參數(shù)案例詳解
這篇文章主要介紹了Java System.getProperty()-獲取系統(tǒng)參數(shù)案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
java實(shí)現(xiàn)把一個(gè)List集合拆分成多個(gè)的操作
這篇文章主要介紹了java實(shí)現(xiàn)把一個(gè)List集合拆分成多個(gè)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
Spring Boot實(shí)現(xiàn)圖片上傳/加水印一把梭操作實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于Spring Boot實(shí)現(xiàn)圖片上傳/加水印一把梭操作的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
Java利用EasyExcel解析動(dòng)態(tài)表頭及導(dǎo)出實(shí)現(xiàn)過(guò)程
以前做導(dǎo)出功能,表頭和數(shù)據(jù)都是固定的,下面這篇文章主要給大家介紹了關(guān)于Java利用EasyExcel解析動(dòng)態(tài)表頭及導(dǎo)出實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12

