天天看點

帶你“找對象”--Java記憶體分析 | 帶你學《Java面向對象程式設計》之二

上一篇:觸摸Java世界的核心:類與對象 | 帶你學《Java面向對象程式設計》之一

【本節目标】

本章深入淺出,結合執行個體帶你了解建立對象的過程中在實體記憶體上發生的故事,了解通過記憶體管理實作引用資料類型的流暢使用。通過本章,你将初步了解到堆記憶體、棧記憶體相關的知識,學會從記憶體上分析建立對象的原理,明白通過堆棧位址互相聯系實作引用資料類型資料的調用原理。

2.1 對象執行個體化操作初步分析

範例:以下面的程式為主進行分析

public class JavaDemo {
    public static void main(String args[]) {
       Person per = new Person() ;     //聲明并執行個體化對象
       per.name = “張三” ;
       per.age = 18 ;
       per.tell() ;            //進行方法的調用
   }
}           

如果要進行記憶體分析,那麼首先給出兩塊最為常用的記憶體空間:

  • 堆記憶體:儲存的是對象的具體資訊,在程式中堆記憶體空間的開辟是通過new完成的;
  • 棧記憶體:儲存的是一塊堆記憶體的位址,即:通過位址找到堆記憶體,而後找到對象内容。但是為了分析簡化起見,可以簡單地了解為:對象名稱儲存在了棧記憶體之中。
帶你“找對象”--Java記憶體分析 | 帶你學《Java面向對象程式設計》之二

圖一 堆記憶體與棧記憶體

清楚了以上的對應關系後,那麼下面就針對于之前的程式進行分析。

Person per = new Person()

帶你“找對象”--Java記憶體分析 | 帶你學《Java面向對象程式設計》之二

圖二 對于Person per = new Person()的記憶體分析

per.name = “張三” ;

帶你“找對象”--Java記憶體分析 | 帶你學《Java面向對象程式設計》之二

圖三 對于per.name = “張三” ;的記憶體分析

per.age = 18 ;

帶你“找對象”--Java記憶體分析 | 帶你學《Java面向對象程式設計》之二

圖四 對于per.age = 18 ;的記憶體分析

在之前進行分析的時候可以發現對象的執行個體化有兩種文法,一種是之前使用的聲明并執行個體化對象,另外一種就是分步完成。

是以下面針對于分步的記憶體操作進行分析。

範例:定義程式代碼

public class JavaDemo {
    public static void main(String args[]) {
      Person per = null;       //聲明對象
      Person per = new Person() ;     //執行個體化對象
      per.name = “張三” ;
      per.age = 18 ;
      per.tell() ;            //進行方法的調用
  }
}           

下面通過記憶體分析來進行解釋。

帶你“找對象”--Java記憶體分析 | 帶你學《Java面向對象程式設計》之二

圖五 對于上述代碼的記憶體分析

需要特别注意的是,所有的對象在調用類中的屬性或方法的時候必須要執行個體化完成後才可以執行。

範例:錯誤的代碼

public class JavaDemo {
    public static void main(String args[]) {
      Person per = null;       //聲明對象
      per.name = “張三” ;
      per.age = 18 ;
      per.tell() ;            //進行方法的調用
  }
}           
帶你“找對象”--Java記憶體分析 | 帶你學《Java面向對象程式設計》之二

圖六 運作結果

代碼之中隻是聲明了對象,但是并沒有為對象進行執行個體化,是以此時無法調用。而此時程式中出現的NullPointerException(空指向異常)就是在沒有在堆記憶體開辟後時所産生的問題,并且隻有引用資料類型存在有此問題。

想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。

本内容視訊來源于

阿裡雲大學 下一篇:對象“變形記”--初識引用與GC | 帶你學《Java面向對象程式設計》之三 更多Java面向對象程式設計文章檢視此處