[javase學習筆記]-7.4 建構函式的記憶體載入
這一節我們來說說建構函式在記憶體中是如何被載入的。
我們之前說過,建構函式只有建立對象時才會被調用並且只調用一次。那麼在建立對象的過程中記憶體中的變化是什麼樣的呢?
我們接著上一節的Person類,我們分析
class Person{private String name;private int age;Person()//建構函式,分別為成員變數name和age賦固定的值{name = "baby";age = 1;System.out.println("person run");}Person(String n)//建構函式,有一個初始name參數{name = n;}Person(String n,int a){name = n;age = a;}public void speak(){System.out.println(name+":"+age);}}我們用下面的兩行代碼來分析一下建構函式在記憶體中的載入過程
class ConsDemo{public static void main(String[] args) {Person p = new Person("小強",10);p.speak();}}對於上面的測試,我們分析它的運行過程:
1.main方法進棧記憶體,main方法中有一個Person類類型變數p;
2.new建立Person對象,在堆記憶體中建立空間(假如地址為0x0045),該空間中有兩個成員變數name和age;
3.對對象的兩個成員變數進行初始化,此時會自動選擇調用建構函式Person(String n,int a);
4.建構函式Person(String n,int a)進棧記憶體,並且有參數n="小強",a=0;
5.然後在堆記憶體中把參數n和a的數值初始化name和age變數,此時對象的初始化完成;
6.把地址0x0045賦給main方法中的變數p;
7.建構函式Person()出棧,釋放參數n和a;
8.執行p.speak()語句,調用Person類中的speak()方法,則speak方法進棧;
9.執行列印語句,跳出speak方法,speak方法出棧;
10.跳出main方法,main方法出棧,程式運行結束。
我們在上面通過對一個簡單的對象建立過程進行了分析,簡單的學習了建構函式在記憶體中的載入和運行過程,這裡也就是突出了對象的初始化,如果類中沒有定義建構函式,那麼我們在建立對象時會調用預設的建構函式,而當我們定義了建構函式,則會通過參數類型選擇不同的建構函式進行對象的初始化,而且我們知道對象都必須被初始化,初始化就會調用相應的建構函式,所以說,建構函式是必須會進棧記憶體的。