Java中類載入過程和物件建立過程
類載入過程:
1, JVM會先去方法區中找有沒有相應類的.class存在。如果有,就直接使用;如果沒有,則把相關類的.class載入到方法區
2, 在.class載入到方法區時,會分為兩部分載入:先載入非靜態內容,再載入靜態內容
3, 載入非靜態內容:把.class中的所有非靜態內容載入到方法區下的非靜態區域內
4, 載入靜態內容:
4.1、把.class中的所有靜態內容載入到方法區下的靜態區域內
4.2、靜態內容載入完成之後,對所有的靜態變數進行預設初始化
4.3、所有的靜態變數預設初始化完成之後,再進行顯式初始化
4.4、當靜態區域下的所有靜態變數顯式初始化完後,執行靜態程式碼塊
5,當靜態區域下的靜態程式碼塊,執行完之後,整個類的載入就完成了。
物件建立過程:
1, 在堆記憶體中開闢一塊空間
2, 給開闢空間分配一個地址
3, 把物件的所有非靜態成員載入到所開闢的空間下
4, 所有的非靜態成員載入完成之後,對所有非靜態成員變數進行預設初始化
5, 所有非靜態成員變數預設初始化完成之後,呼叫建構函式
6, 在建構函式入棧執行時,分為兩部分:先執行建構函式中的隱式三步,再執行建構函式中書寫的程式碼
6.1、隱式三步:
1,執行super語句
2,對開闢空間下的所有非靜態成員變數進行顯式初始化
3,執行構造程式碼塊
6.2、在隱式三步執行完之後,執行建構函式中書寫的程式碼
7,在整個建構函式執行完並彈棧後,把空間分配的地址賦值給一個引用物件
總結類中能書寫的成員
棧: 用來執行函式。可以儲存區域性資訊
特點:先進後出
堆:用來儲存實體(被new創建出來的)。
特點:
1, 每一個實體所開闢的空間都有一個地址
2, 每一個實體中儲存的資料都有一個預設初始值
方法區:存放class和static。 方法區其實是由N多個小的區域構成。有存放非靜態內容的非靜態區域,還有存放靜態內容的靜態區域,還有存放常量的常量池 等
class ABC
{
非靜態成員變數
靜態成員變數
非靜態
靜態成員函式
建構函式:ABC(...){...}
靜態程式碼塊: static {...}
構造程式碼塊 : {...}
}
圖解呼叫過程:
物件建立過程程式碼和註釋:
class Person {
int age;
Person(int age) {
this.age = age;
}
}
class Student extends Person {
// 2,對開闢空間下的所有非靜態成員變數進行顯式初始化
String school = "abc";
Student(String school, int age) {
// 1,執行super語句
super(age);
// 4、在隱式三步執行完之後,執行建構函式中書寫的程式碼
this.school = school;
}
{
// 3,執行構造程式碼塊
System.out.println("Student code block");
}
}