類加載器主要就是把字節(jié)碼文件加載到內(nèi)存當(dāng)中,生成大的Class實(shí)例
1. ClassLoader只負(fù)責(zé)class文件的加載夕膀,至于它是否可以運(yùn)行,由Execution Engine決定
2. 加載的類信息存放在方法區(qū)(永久代/元空間)中,里面還存放運(yùn)行時(shí)常量池信息冷溃。
類加載過程
加載:將字節(jié)碼文件轉(zhuǎn)換為二進(jìn)制字節(jié)流轉(zhuǎn)換為運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu),生成一個(gè)大的Class文件
鏈接:
? ? ? ? 驗(yàn)證:確保大Class文件的字節(jié)流包含信息是正確的
? ? ? ? 準(zhǔn)備:給類變量分配內(nèi)存(在方法區(qū)中)梦裂,賦默認(rèn)值似枕。(不包括final修飾的static,final修飾的在編譯階段就會(huì)分配了年柠,在這里會(huì)進(jìn)行顯視初始化)
????????解析:常量池內(nèi)的符號(hào)引用轉(zhuǎn)換為直接引用的過程
初始化:執(zhí)行類構(gòu)造器<clinit>方法(不是我們知道的類構(gòu)造器方法)凿歼,主要是為靜態(tài)變量賦值,如果不存在靜態(tài)變量彪杉,我們?cè)谧止?jié)碼文件中就看不到這個(gè)clinit方法毅往。
由于按照順序執(zhí)行,所以最后的num值是10派近。因?yàn)樵陬惣虞d的鏈接準(zhǔn)備階段就已經(jīng)為類變量分配內(nèi)存且設(shè)置初始值了攀唯,所以不會(huì)報(bào)錯(cuò)。