面試題——Java 類(lèi)加載/創(chuàng)建對(duì)象的過(guò)程

簡(jiǎn)潔回答:

  • 第一步诺凡,判斷常量池是否能定位類(lèi)的符號(hào)引用说贝,并且檢查這個(gè)符號(hào)引用代表的類(lèi)是否被加載议惰、解析、初始化過(guò)乡恕。如果沒(méi)有則執(zhí)行第一步言询,如果有則執(zhí)行第二步
  • 第二步類(lèi)加載和初始化(初次使用),具體可分為加載傲宜、驗(yàn)證运杭、準(zhǔn)備、解析函卒、初始化
  • 第三步創(chuàng)建對(duì)象辆憔,具體可分為實(shí)例對(duì)象分配內(nèi)存、賦值、執(zhí)行實(shí)例初始化代碼虱咧、返回引用

詳細(xì)回答

第一步

判斷常量池是否能定位類(lèi)的符號(hào)引用熊榛,并且檢查這個(gè)符號(hào)引用代表的類(lèi)是否被加載、解析彤钟、初始化過(guò)。如果沒(méi)有則執(zhí)行第一步跷叉,如果有則執(zhí)行第二步

第二步逸雹,類(lèi)加載和初始化(初次使用)

如果類(lèi)已經(jīng)被加載過(guò),則不會(huì)執(zhí)行第一步整個(gè)步驟

1. 加載
  • 類(lèi)加載器根據(jù)類(lèi)的全限定名來(lái)讀取此類(lèi)的二進(jìn)制字節(jié)流到JVM內(nèi)部云挟,并存儲(chǔ)在運(yùn)行時(shí)內(nèi)存區(qū)的方法區(qū)梆砸,然后將其轉(zhuǎn)換為一個(gè)與目標(biāo)類(lèi)型對(duì)應(yīng)的java.lang.Class對(duì)象實(shí)例
2. 驗(yàn)證
  • 格式驗(yàn)證:驗(yàn)證是否符合class文件規(guī)范,比如必須以魔數(shù)0xCAFEBABE開(kāi)頭
  • 語(yǔ)義驗(yàn)證:檢查一個(gè)被標(biāo)記為final的類(lèi)型是否包含子類(lèi)园欣;檢查一個(gè)類(lèi)中的final方法是否被子類(lèi)進(jìn)行重寫(xiě)帖世;確保父類(lèi)和子類(lèi)之間沒(méi)有不兼容的一些方法聲明(比如方法簽名相同,但方法的返回值不同)
  • 操作驗(yàn)證:在操作數(shù)棧中的數(shù)據(jù)必須進(jìn)行正確的操作沸枯,對(duì)常量池中的各種符號(hào)引用執(zhí)行驗(yàn)證(通常在解析階段執(zhí)行日矫,檢查是否可以通過(guò)符號(hào)引用中描述的全限定名定位到指定類(lèi)型上,以及類(lèi)成員信息的訪問(wèn)修飾符是否允許訪問(wèn)等)
3. 準(zhǔn)備
  • 為類(lèi)中的所有靜態(tài)變量/常量分配內(nèi)存空間绑榴,并為其設(shè)置一個(gè)初始值(由于還沒(méi)有產(chǎn)生對(duì)象哪轿,實(shí)例變量不在此操作范圍內(nèi))

public static int value= 1,初始化后的值為 0

public static final int value= 1翔怎,初始化后的值為 1

4. 解析
  • 將常量池中的符號(hào)引用轉(zhuǎn)為直接引用(得到類(lèi)或者字段窃诉、方法在內(nèi)存中的指針或者偏移量,以便直接調(diào)用該方法)

符號(hào)引用:比如我們規(guī)定了json字符串赤套,"{}"表示對(duì)象飘痛,"[]"表示數(shù)組,"{}"和"[]"就相當(dāng)于符號(hào)引用容握。在JVM中符號(hào)引用是用一組符號(hào)描述所引用的目標(biāo)宣脉,比如用0x4000聲明這是一個(gè)枚舉類(lèi)型

直接引用:內(nèi)存地址(指針/偏移量/句柄)

5. 初始化(先父類(lèi),再子類(lèi))
  • 執(zhí)行類(lèi)構(gòu)造器 init 方法剔氏,init方法包含 為靜態(tài)變量賦值脖旱、執(zhí)行static代碼塊

第三步,創(chuàng)建對(duì)象

1. 在堆區(qū)為實(shí)例對(duì)象分配內(nèi)存
  • 為實(shí)例變量分配內(nèi)存(包括本類(lèi)和父類(lèi))介蛉,但不包括任何靜態(tài)變量
2. 對(duì)實(shí)例變量賦默認(rèn)值
  • 將方法區(qū)內(nèi)對(duì)實(shí)例變量的定義拷貝一份到堆區(qū)萌庆,然后賦默認(rèn)值
3. 執(zhí)行實(shí)例初始化代碼
  • 初始化父類(lèi)再初始化子類(lèi),初始化時(shí)先執(zhí)行非靜態(tài)代碼塊(包括非靜態(tài)初始化塊币旧,非靜態(tài)屬性)再執(zhí)行構(gòu)造方法

非靜態(tài)代碼塊也叫做實(shí)例代碼塊

4. 將堆區(qū)對(duì)象的地址賦值給棧區(qū)的引用變量
  • 有類(lèi)似于Child c = new Child()形式的引用践险,將堆區(qū)對(duì)象的地址賦值給棧區(qū)的引用變量c


流程圖

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子巍虫,更是在濱河造成了極大的恐慌彭则,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件占遥,死亡現(xiàn)場(chǎng)離奇詭異俯抖,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)瓦胎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)芬萍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人搔啊,你說(shuō)我怎么就攤上這事柬祠。” “怎么了负芋?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵漫蛔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我旧蛾,道長(zhǎng)莽龟,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任锨天,我火速辦了婚禮轧房,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绍绘。我一直安慰自己奶镶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布陪拘。 她就那樣靜靜地躺著阁危,像睡著了一般促脉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,785評(píng)論 1 314
  • 那天胸墙,我揣著相機(jī)與錄音细卧,去河邊找鬼蚊锹。 笑死咧虎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的喇辽。 我是一名探鬼主播掌挚,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼菩咨!你這毒婦竟也來(lái)了吠式?” 一聲冷哼從身側(cè)響起陡厘,我...
    開(kāi)封第一講書(shū)人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎特占,沒(méi)想到半個(gè)月后糙置,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡是目,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年谤饭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片懊纳。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡揉抵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出长踊,到底是詐尸還是另有隱情功舀,我是刑警寧澤萍倡,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布身弊,位于F島的核電站,受9級(jí)特大地震影響列敲,放射性物質(zhì)發(fā)生泄漏阱佛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一戴而、第九天 我趴在偏房一處隱蔽的房頂上張望凑术。 院中可真熱鬧,春花似錦所意、人聲如沸淮逊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)泄鹏。三九已至,卻和暖如春秧耗,著一層夾襖步出監(jiān)牢的瞬間备籽,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工分井, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留车猬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓尺锚,卻偏偏與公主長(zhǎng)得像珠闰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瘫辩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361