類加載過程:html
1, JVM會先去方法區中找有沒有相應類的.class存在。若是有,就直接使用;若是沒有,則把相關類的.class加載到方法區java
2, 在.class加載到方法區時,會分爲兩部分加載:先加載非靜態內容,再加載靜態內容ide
3, 加載非靜態內容:把.class中的全部非靜態內容加載到方法區下的非靜態區域內函數
4, 加載靜態內容:this
4.一、把.class中的全部靜態內容加載到方法區下的靜態區域內url
4.二、靜態內容加載完成以後,對全部的靜態變量進行默認初始化spa
4.三、全部的靜態變量默認初始化完成以後,再進行顯式初始化code
4.四、執行靜態代碼塊(注:靜態代碼塊與靜態變量顯式初始化無前後順序,與代碼順序相關,如靜態代碼塊在上,則先加載代碼塊)orm
5,整個類的加載就完成了。htm
對象建立過程:
1, 在堆內存中開闢一塊空間
2, 給開闢空間分配一個地址
3, 把對象的全部非靜態成員加載到所開闢的空間下
4, 全部的非靜態成員加載完成以後,對全部非靜態成員變量進行默認初始化
5, 全部非靜態成員變量默認初始化完成以後,調用構造函數
6, 在構造函數入棧執行時,分爲兩部分:先執行構造函數中的隱式三步,再執行構造函數中書寫的代碼
6.一、隱式三步:
1,執行super語句
2,對開闢空間下的全部非靜態成員變量進行顯式初始化
3,執行構造代碼塊(注:代碼塊與非靜態成員變量顯示初始化無前後順序,與代碼順序相關,如代碼塊在上,則先加載代碼塊)
6.二、在隱式三步執行完以後,執行構造函數中書寫的代碼
7,在整個構造函數執行完並彈棧後,把空間分配的地址賦值給一個引用對象
棧: 用來運行函數。能夠存儲局部信息
特色:先進後出
堆:用來存儲實體(被new建立出來的)。
特色:
1, 每個實體所開闢的空間都有一個地址
2, 每個實體中存儲的數據都有一個默認初始值
方法區:存放class和static。 方法區實際上是由N多個小的區域構成。有存放非靜態內容的非靜態區域,還有存放靜態內容的靜態區域,還有存放常量的常量池 等
class ABC
{
非靜態成員變量
靜態成員變量
非靜態成員函數
靜態成員函數
構造函數:ABC(...){...}
靜態代碼塊: static {...}
構造代碼塊 : {...}
}
圖解調用過程:
父子類加載及建立對象過程代碼實例:
運行結果:
對象建立過程代碼和註釋: