對象與內存控制

1.Class文件

    Java class文件是對Java程序二進制文件格式的精確定義,每一個java class文件都對一個類或者一個接口作出了全面的描述。當每一次使用類時,JVM會檢查對應的class文件是否已經加載,如果未加載,則需要通過類加載子系統來加載。類加載的過程如下:

    (1)裝載-----查找並裝載類型的二進制數據,即讀取.class文件。

    (2)連接-----執行驗證準備以及解析。

           驗證:確保被導入類型的正確性;

           準備:爲類變量分配內存,並將其初始化爲默認的值;

           解析:把類型中的符號引用轉化爲直接引用;

    若正在被加載的類還有父類,且父類沒有被加載,則對其所有父類(未加載的)執行步驟1和步驟2,加載順序爲從直接基類到最上層的父類依次執行裝載和連接。

    (3)初始化-----將類變量初始化爲正確的初始值。對所有未加載的父類,從最上層的父類開始依次往下到最該類,執行靜態初始化和靜態初始化塊。

    在生成實例對象的時候,首先給實例變量分配相應的內存,也會爲其父類中定義的所有實例變量分配內存,對所有父類(從上到下)執行非靜態初始化塊,構造器。依次調用完成以後,才執行本類的非靜態初始化塊和構造函數。

2.final變量

    當定義final變量爲就爲該變量指定了初始值,而且該初始值可以在編譯時就確定下來,那麼這個final變量本質上就是一個“宏變量”,編譯器會把程序中所有用到該變量的地方都直接替換成該變量的值。


3.字符串字面值

    Java會緩存使用過的字符串,把字符串的字面常量都放在了字符串駐留池中。

   String a="java";
   String b="java";
    上面的代碼中,首先定義了一個字符串對象a,由於“java’是一個字符串的字面常量,因此會緩存到字符串緩存池中。當運行到第二句時,編譯器不會創建兩一個字符串對象,而是直接將引用變量b指向字符串緩衝池中的常量“java"。此時,a和b其實引用的是同一個字符串對象。執行以下語句將返回true。

   System.out.println(a==b); //true


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章