Java:Java實例化(new)過程


實例化過程(new)

1.首先去JVM 的方法區中區尋找類的class對象,如果能找到,則按照定義生成對象,找不到 >>如下2.所示

2.加載類定義:類加載器(classLoader)尋找該類的 .class文件,找到后對文件進行分析轉換為class對象存入方法區方便以后調用。

其中jdk 的class一般是在jvm啟動時用啟動類加載器完成加載,用戶的class則是在用到的時候再加載。

 

 

Java中ClassLoader的加載采用了雙親委托機制,采用雙親委托機制加載類的時候采用如下的幾個步驟
1.  當前ClassLoader首先從自己已經加載的類中查詢是否此類已經加載,如果已經加載則直接返回原來已經加載的類。
每個類加載器都有自己的加載緩存,當一個類被加載了以后就會放入緩存,等下次加載的時候就可以直接返回了。
2.  當前classLoader的緩存中沒有找到被加載的類的時候,委托父類加載器去加載,父類加載器采用同樣的策略,首先查看自己的緩存,然后委托父類的父類去加載,一直到bootstrp ClassLoader.
3.  當所有的父類加載器都沒有加載的時候,再由當前的類加載器加載,並將其放入它自己的緩存中,以便下次有加載請求的時候直接返回。
說到這里大家可能會想,Java為什么要采用這樣的委托機制?理解這個問題,我們引入另外一個關於Classloader的概念“命名空間”, 它是指要確定某一個類,需要類的全限定名以及加載此類的ClassLoader來共同確定。也就是說即使兩個類的全限定名是相同的,但是因為不同的ClassLoader加載了此類,那么在JVM中它是不同的類。明白了命名空間以后,我們再來看看委托模型。采用了委托模型以后加大了不同的 ClassLoader的交互能力,比如上面說的,我們JDK本生提供的類庫,比如hashmap,linkedlist等等,這些類由bootstrp 類加載器加載了以后,無論你程序中有多少個類加載器,那么這些類其實都是可以共享的,這樣就避免了不同的類加載器加載了同樣名字的不同類以后造成混亂。

 

在jvm的堆中給對象開辟一個內存空間(對象初始化)順序如下:

(1) 父類靜態對象,靜態代碼塊

(2)子類靜態對象,靜態代碼塊

(3)父類非靜態對象,非靜態代碼塊

(4)父類構造函數

(5)子類非靜態對象,非靜態代碼塊

(6)子類構造函數

 

 


文章轉載至:https://blog.csdn.net/qq_25269997/article/details/77429730


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM