JAVA對象在內存中實例化的過程


        JAVA對象在內存中實例化的過程

在講 Java 對象在內存中的實例化過程前,先來說下在類的實例化過程中,內存會使用到的三個區域:棧區堆區方法區

堆區: 存儲的全部都是對象,每個對象包含了一個與之對應的 class 類的信息。 jvm 只有一個堆區(steap),它會被所有線程共享,堆中不存放基本數據類型和對象引用,它只存放對象本身。 棧區: 每個線程都包含一個棧區,棧中只保存基本數據類型的值和對象以及基礎數據的引用。 每個棧中的數據(基本數據類型和對象的引用)都是私有的,其它棧是無法進行訪問的。 棧分為三個部分:基本類型變量區、執行環境上下文、操作指令區(存放操作指令)。 方法區: 又被稱為靜態區,它跟堆一樣,被所有的線程共享,方法區包含所有的 class 信息 和 static修飾的變量。 方法區中包含的都是整個程序中永遠唯一的元素,如:class、static變量。

類實例化時內存中發生的變化

首先我們先對下面的代碼進行分析:

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()函數也會出棧 如圖:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM