JAVA對象在內存中實例化的過程
在講 Java 對象在內存中的實例化過程前,先來說下在類的實例化過程中,內存會使用到的三個區域:棧區、堆區、方法區。
堆區: 存儲的全部都是對象,每個對象包含了一個與之對應的 class 類的信息。
類實例化時內存中發生的變化
首先我們先對下面的代碼進行分析:
public class People{
String name; // 定義一個成員變量 name
int age; // 成員變量 age
Double height; // 成員變量 height
void sing(){
System.out.println("人的姓名:"+name);
System.out.println("人的年齡:"+age);
System.out.println("人的身高:"+height);
}
public static void main(String[] args) {
String name; // 定義一個局部變量 name
int age; // 局部變量 age
Double height; // 局部變量 height
People people = new People() ; //實例化對象people
people.name = "張三" ; //賦值
people.age = 18; //賦值
people.stuid = 180.0 ; //賦值
people.sing(); //調用方法sing
}
}
代碼解析:
這段代碼首先定義三個成員變量:String name、int age、Double height 這三個變量都是只聲明了沒有初始化,然后定義了一個成員方法 sing();
在 main()方法里同樣定義了三個一樣的變量,只不過這些是局部變量;
在main() 函數里實例化對象 people , 內存中在堆區內會給實例化對象 people 分配一片地址,緊接着我們對實例化對象 people 進行了賦值。people 調用成員方法 sing() 。mian()函數打印輸入人的姓名,人的年齡和人的身高,系統執行完畢。
下面通過圖解法展示實例化對象的過程中內存的變化
在程序的執行過程中,首先類中的成員變量和方法體會進入到方法區,如圖:
程序執行到 main() 方法時,main()函數方法體會進入棧區,這一過程叫做進棧(壓棧),定義了一個用於指向 Person 實例的變量 person。如圖:
程序執行到 Person person = new Person(); 就會在堆內存開辟一塊內存區間,用於存放 Person 實例對象,然后將成員變量和成員方法放在 new 實例中都是取成員變量&成員方法的地址值 如圖:
接下來對 person 對象進行賦值, person.name = “小二” ; perison.age = 13; person.height= 180.0;
先在棧區找到 person,然后根據地址值找到 new Person() 進行賦值操作。
如圖:
當程序走到 sing() 方法時,先到棧區找到 person這個引用變量,然后根據該地址值在堆內存中找到 new Person() 進行方法調用。
在方法體void speak()被調用完成后,就會立刻馬上從棧內彈出(出站 )
最后,在main()函數完成后,main()函數也會出棧 如圖: