1. 程式人生 > >Java中類載入過程和物件建立過程

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");
	}
}