1.類加載過程
首先,jvm在執行時,遇到一個新的類時,會到內存中的方法區去找class文件,如果找到就直接拿來用,
如果沒有找到,就會到硬盤中去找到這個class文件,將類文件加載到方法區,在類加載時,靜態成員變量加載
到方法區的靜態區域,非靜態成員變量加載到方法區的非靜態區域,加載靜態成員變量的時候,會根據書寫的順序,
將所有的靜態成員變量加載到靜態方法區,然后給所有的靜態成員變量賦默認值,賦默認值后,會根據靜態成員
變量書寫的位置,給靜態成員變量賦顯示值,和執行靜態代碼。當執行完所有的靜態代碼塊時,類才算加載完成。
類加載過程:
1.JVM會先去方法區中找有沒有相應類的.class存在。如果有,就直接使用;如果沒有,則把相關類的.class加載到方法區。
2.在.class加載到方法區時,會分為兩部分加載:先加載非靜態內容,在加載靜態內容。
3.在加載非靜態內容:把.class中的所有非靜態內容加載到方法區下的非靜態區域內
4.加載靜態內容:
4.1把.class中所有靜態內容加載到方法區下的靜態區域內。
4.2靜態內容加載完成之后,對所有的靜態變量進行默認初始化。
4.3所有的靜態變量默認初始化完成之后,再進行顯示初始化。
4.4當靜態區域下的所有靜態變量顯示初始化完后,執行靜態代碼塊。
5.當靜態區域下的靜態代碼塊,執行完之后,整個類的加載就完成了。
2.對象創建過程:
1.在堆內存中開辟一塊空間。
2.給開辟空間分配一個地址。
3.把對象的所有非靜態成員加載到所開辟的空間下。
4.所有的非靜態成員加載完成之后,對所有非靜態成員變量進行默認初始化。
5.所有非靜態成員變量默認初始化完成之后,調用構造函數。
6.在構造函數入棧執行時,分為兩部分:先執行構造函數中的隱式三步,在執行構造函數中書寫的代碼。
6.1隱式三步:
1.執行super語句
2.對開辟空間下的所有非靜態成員變量進行顯示初始化
3.執行構造代碼塊
6.2在隱式三步執行完之后,執行構造函數中書寫的代碼
7.在整個構造函數執行完並彈棧后,把空間分配的地址賦值給一個引用對象
