經(jīng)典面試題:static加載機制你知道嗎?
經(jīng)典面試題:static加載機制你知道嗎?
static在Java中是一個很常見的關(guān)鍵字,同時它也是面試時的一個高頻考點。那么在Java類中,static的加載機制到底是怎樣的呢?接下來小編就來帶大家弄明白這個問題。
一. 類加載機制
JVM在首次使用某個類時,會通過 classpath 來查找該類的.class文件。然后將.class文件中對類的描述信息加載到內(nèi)存中進行保存,如:包名、類名、父類、屬性、方法、構(gòu)造方法......一個類的加載過程大致如下:
加載時機
創(chuàng)建對象
創(chuàng)建子類對象
訪問靜態(tài)屬性
調(diào)用靜態(tài)方法
主動加載:Class.forName(“全限定名”)
二. static 特點
被static關(guān)鍵字修飾的類或方法、成員等具有如下特點:
靜態(tài)方法允許直接訪問靜態(tài)成員;
靜態(tài)方法不能直接訪問非靜態(tài)成員;
靜態(tài)方法中不允許使用this或是super關(guān)鍵字;
靜態(tài)方法可以繼承,不能重寫、沒有多態(tài)。
三. 經(jīng)典面試題
接著我們再來看看關(guān)于static的一個經(jīng)典面試題,代碼案例如下:
public class Test {
public static int k = 0;
public static Test t1 = new Test("t1");
public static Test t2 = new Test("t2");
public static int i = print("i");
public static int n = 99;
private int a = 0;
public int j = print("j");
{
print("構(gòu)造代碼塊");
}
static{
print("靜態(tài)構(gòu)造代碼塊");
}
public Test(String str){
System.out.println((++k)+":"+str+" i="+i+" n="+n);
++i;
++n;
}
public static int print(String str){
System.out.println((++k)+":"+str+" i="+i+" n="+n);
++n;
return ++i;
}
public static void main(String[] args) {
}
}
這是一道關(guān)于static加載執(zhí)行順序的經(jīng)典面試題,根據(jù)代碼觀察執(zhí)行結(jié)果,接下來我們就來分析一下上述代碼的執(zhí)行結(jié)果是什么。
在執(zhí)行 main 方法,也就是程序主入口的時候,首先會加載所在的類,聲明靜態(tài)變量,初始化靜態(tài)屬性,執(zhí)行靜態(tài)代碼塊(按照順序執(zhí)行),所以首先加載的是:
public static int k = 0;
2. 其次加載:
public static Test t1 = new Test("t1");
3. 而加載到實例化 t1 對象時,類的加載會暫停,然后創(chuàng)建 Test 的實例對象。在創(chuàng)建 Test 對象時則會先加載屬性再執(zhí)行代碼塊,最后執(zhí)行構(gòu)造方法,所以先執(zhí)行的會是實例屬性。
private int a = 0;
public int j = print("j");
public static int print(String str){
System.out.println((++k)+":"+str+" i="+i+" n="+n);
++n;
return ++i;
}
4. 因加載類的過程中,會對定義的靜態(tài)字段在方法區(qū)中分別分配空間,并賦予初始化值,所以 i 和 n 的值都為0,因此第一個打印語句是:
1:j i=0 n=0
5. 實例屬性加載完畢后,則進行構(gòu)造代碼塊的加載:
{
print("構(gòu)造代碼塊");
}
public static int print(String str){
System.out.println((++k)+":"+str+" i="+i+" n="+n);
++n;
return ++i;
}
6. 因為第一次調(diào)用時已經(jīng)對 k 、i 、n 的值進行了自加,因此第二個打印語句是:
2:構(gòu)造代碼塊 i=1 n=1
7. 實例化對象的最后一步,則是執(zhí)行構(gòu)造方法:
public static Test t1 = new Test("t1");
public Test(String str){
System.out.println((++k)+":"+str+" i="+i+" n="+n);
++i;
++n;
}
8. 因此第三個打印語句是:
3:t1 i=2 n=2
9. t1 對象創(chuàng)建完畢后,類加載則繼續(xù)執(zhí)行,因此下一步則是:
public static Test t2 = new Test("t2");
10. 按照前面實例化 t1 的執(zhí)行機制,因此接下來的打印的幾句則是:
4:j i=3 n=3
5:構(gòu)造代碼塊 i=4 n=4
6:t2 i=5 n=5
11. 實例化完 t2 對象后,繼續(xù)進行類加載,因此下一步加載靜態(tài)屬性 i 的賦值:
public static int i = print("i");
public static int print(String str){
System.out.println((++k)+":"+str+" i="+i+" n="+n);
++n;
return ++i;
}
12. 因此下一步打印結(jié)果為:
7:i i=6 n=6
13. 加載完最后一個靜態(tài)屬性 n= 99 后,則加載靜態(tài)構(gòu)造代碼塊:
public static int n = 99;
static{
print("靜態(tài)構(gòu)造代碼塊");
}
public static int print(String str){
System.out.println((++k)+":"+str+" i="+i+" n="+n);
++n;
return ++i;
}
13. 因此最后會打印:
8:靜態(tài)構(gòu)造代碼塊 i=7 n=99
14. 所以整體的執(zhí)行結(jié)果會是:
1:j i=0 n=0
2:構(gòu)造代碼塊 i=1 n=1
3:t1 i=2 n=2
4:j i=3 n=3
5:構(gòu)造代碼塊 i=4 n=4
6:t2 i=5 n=5
7:i i=6 n=6
8:靜態(tài)構(gòu)造代碼塊 i=7 n=99
四. 小結(jié)
現(xiàn)在你知道一個Java類的加載執(zhí)行機制了嗎?可以說,掌握 static 在程序中的加載執(zhí)行順序,可以使我們更好地理解代碼,明白程序的執(zhí)行流程。今天小編只是通過這樣的一個小案例,給大家展現(xiàn)了 static 使用的冰山一角,它還有更多的神奇之處有待于我們繼續(xù)挖掘,請大家繼續(xù)關(guān)注小編哦。

猜你喜歡LIKE
相關(guān)推薦HOT
更多>>
SEO優(yōu)化
SEO優(yōu)化,1、合理的title、description、keywords:搜索對著三項的權(quán)重逐個減小,title值強調(diào)重點即可;description把頁面內(nèi)容高度概括,不可過...詳情>>
2023-04-03 15:11:51
Python數(shù)據(jù)生產(chǎn)器
Python數(shù)據(jù)生產(chǎn)器,在軟件開發(fā)、測試或者數(shù)據(jù)分析過程中,有時候會需要一些測試數(shù)據(jù)。做測試的時候,需要模擬真實的環(huán)境,但是又不能直接使用真...詳情>>
2023-03-28 15:56:13
Java集合是什么?Java集合詳解
Java集合是Java編程語言中的一個重要概念,用于存儲、管理和處理數(shù)據(jù)。Java集合框架提供了一組接口和類,用于實現(xiàn)常見的數(shù)據(jù)結(jié)構(gòu),如列表、棧、...詳情>>
2023-03-20 19:12:47
js查找字符串中指定字符的位置
另外,如果要查找一個字符串中所有出現(xiàn)的指定字符的位置,可以使用indexOf()方法結(jié)合循環(huán)來實現(xiàn)。然后,我們使用循環(huán)遍歷字符串中的每一個字符...詳情>>
2023-03-10 14:06:35熱門推薦
跨域如何解決
沸SEO優(yōu)化
熱Null和undefined的區(qū)別
熱Python數(shù)據(jù)生產(chǎn)器
新react中怎么實現(xiàn)vue中的計算屬性以及watch
經(jīng)典面試題:static加載機制你知道嗎?
消息中間件常用協(xié)議有哪些
Java集合是什么?Java集合詳解
線程池實現(xiàn)原理
java數(shù)據(jù)結(jié)構(gòu)與算法
Java到底有多難?
js查找字符串中指定字符的位置
jquery獲取checkbox是否選中
四種方式創(chuàng)建SpringBoot項目
技術(shù)干貨







快速通道 更多>>
-
課程介紹
點擊獲取大綱 -
就業(yè)前景
查看就業(yè)薪資 -
學(xué)習費用
了解課程價格 -
優(yōu)惠活動
領(lǐng)取優(yōu)惠券 -
學(xué)習資源
領(lǐng)3000G教程 -
師資團隊
了解師資團隊 -
實戰(zhàn)項目
獲取項目源碼 -
開班地區(qū)
查看來校路線