【零碎JAVA】java中新建對象在類中的加載過程

學習一門語言,對內存結構的掌握是很有必要的,熟練的瞭解程序執行過程中內存分配情況,可以在我們開發過程中避免很多費時的調試時間。

看了畢向東老師講解的新建對象的過程,下面做一下總結。


假設我們存在一個Person類,

class Person{
	private String name;
	private int age;
	private static String country = "USA";

	static{
		System.out.println(country);
	}
	{
		System.out.println(name + ":" + age);
	}

	Person(){}
	Person(String name, int age){
		this.name = name;
		this.age = age;
	}
	/*
		其他的一些方法
	*/
}




我們在主函數中執行Person p = new Person("zhangsan", 20);他在內存中是如何實現的呢?
其執行過程如下:
1.new一個Person對象,系統回去尋找Person.class文件,並把這個文件加載到內存中。
2.我們知道,類成員和類方法可以分爲靜態的和非靜態的,靜態的成員與方法優先存在於內存,因爲靜態成員,方法是屬於類的,非靜態成員,方法是屬於對象的,所以第二步  會將類中聲明的靜態方法,成員加載到共享內存中。處於靜態代碼塊(即static{...}中的語句)的代碼會被執行。
3.新建Person對象,在堆內存中開闢一塊空間用於存放這個Person對象。
4.在分配到的Person所在位置的內存中創建類的特有屬性(即非靜態成員),並進行默認的初始化工作。
5.對類的特有屬性進行顯示初始化操作(即聲明屬性時就給他賦上默認的值private String name = "lisi")。
6.執行初始化代碼塊中的語句(即{...}中的語句)。
7.根據傳入的參數選擇合適的構造函數,對對象進行初始化操作。
8.在棧中開闢一段空間,存放引用變量p,並將Person對象所在的內存地址賦給引用變量p。
以上是我的理解,如有疑問,歡迎一起討論,如有不對,希望大家能指出,共同提高,謝謝!!!

<pre code_snippet_id="207142" snippet_file_name="blog_20140226_1_3671840">




發佈了36 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章