學習一門語言,對內存結構的掌握是很有必要的,熟練的瞭解程序執行過程中內存分配情況,可以在我們開發過程中避免很多費時的調試時間。
看了畢向東老師講解的新建對象的過程,下面做一下總結。
假設我們存在一個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">