圖文詳解Java中class的初始化順序
class的裝載
在講class的初始化之前,我們來講解下class的裝載順序。
以下摘自《Thinking in Java 4》
由于Java 中的一切東西都是對象,所以許多活動
變得更加簡單,這個(gè)問題便是其中的一例。正如下一章會講到的那樣,每個(gè)對象的代碼都存在于獨(dú)立的文件中。除非真的需要代碼,否則那個(gè)文件是不會載入的。通常,我們可認(rèn)為除非那個(gè)類的一個(gè)對象構(gòu)造完畢,否則代碼不會真的載入。由于static 方法存在一些細(xì)微的歧義,所以也能認(rèn)為“類代碼在首次使用的時(shí)候載入”。
首次使用的地方也是static 初始化發(fā)生的地方。裝載的時(shí)候,所有static 對象和static 代碼塊都會按照本來的順序初始化(亦即它們在類定義代碼里寫入的順序)。當(dāng)然,static 數(shù)據(jù)只會初始化一次。
簡要的說就是,在類有繼承關(guān)系時(shí),類加載器上溯造型,進(jìn)行相關(guān)類的加載工作。
比如:
Class B extends Class A 當(dāng)我們new B()時(shí),類加載器自動加載A的代碼
class的初始化順序
通常是以下這樣的初始化順序:
(static對象和static代碼塊,依據(jù)他們的順序進(jìn)行初始化)>成員變量>構(gòu)造函數(shù)

測試代碼
public class ClassInit {
/**
* @Title: main
* @Description: 類初始化順序測試
* @param: @param args
* @return: void
* @throws
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new B();
}
}
class A {
static{
System.out.println("A的static代碼塊...");
}
public String s1 = prtString("A的成員變量...");
public static String s2 = prtString("A的static變量...");
public A(){
System.out.println("A的構(gòu)造函數(shù)...");
}
public static String prtString(String str) {
System.out.println(str);
return null;
}
}
class B extends A{
public String ss1 = prtString("B的成員變量...");
public static String ss2 = prtString("B的static變量...");
public B(){
System.out.println("B的構(gòu)造函數(shù)...");
}
private static A a = new A();
static{
System.out.println("B的static代碼塊...");
}
{
System.out.println("代碼塊...");
}
}
測試結(jié)果
A的static代碼塊...
A的static變量...
B的static變量...
A的成員變量...
A的構(gòu)造函數(shù)...
B的static代碼塊...
A的成員變量...
A的構(gòu)造函數(shù)...
B的成員變量...
代碼塊...
B的構(gòu)造函數(shù)...
總結(jié)
以上就是Java中class的初始化順序的全部內(nèi)容,希望對大家使用Java能有所幫助。
相關(guān)文章
SpringBoot+Vue實(shí)現(xiàn)數(shù)據(jù)添加功能
這篇文章主要介紹了SpringBoot+Vue實(shí)現(xiàn)數(shù)據(jù)添加功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Java中使用增強(qiáng)for循環(huán)的實(shí)例方法
在本篇文章里小編給大家整理是的關(guān)于Java中如何使用增強(qiáng)for循環(huán)的實(shí)例內(nèi)容以及相關(guān)代碼,需要的朋友們可以學(xué)習(xí)下。2019-08-08
Java Kafka實(shí)現(xiàn)優(yōu)先級隊(duì)列的示例詳解
在分布式系統(tǒng)中,消息隊(duì)列是一種常見的異步通信機(jī)制,而優(yōu)先級隊(duì)列則是消息隊(duì)列的一種特殊形式,下面我們來看看如何利用Kafka實(shí)現(xiàn)優(yōu)先級隊(duì)列吧2025-03-03
SpringBoot應(yīng)用自定義logback日志詳解
默認(rèn)情況下,SpringBoot內(nèi)部使用logback作為系統(tǒng)日志實(shí)現(xiàn)的框架,將日志輸出到控制臺,不會寫到日志文件。本篇文章主要講解下如何自定義logabck.xml以及對logback文件中配置做一個(gè)詳解,需要的可以參考一下2022-10-10
SpringBoot3實(shí)戰(zhàn)教程之實(shí)現(xiàn)接口簽名驗(yàn)證功能
接口簽名是一種重要的安全機(jī)制,用于確保 API 請求的真實(shí)性、數(shù)據(jù)的完整性以及防止重放攻擊,這篇文章主要介紹了SpringBoot3實(shí)戰(zhàn)教程之實(shí)現(xiàn)接口簽名驗(yàn)證功能,需要的朋友可以參考下2025-04-04

