類的例項化順序和分析
1. 父類靜態成員和靜態初始化塊 ,按在程式碼中出現的順序依次執行
2. 子類靜態成員和靜態初始化塊 ,按在程式碼中出現的順序依次執行
3. 父類例項成員和例項初始化塊 ,按在程式碼中出現的順序依次執行
4. 父類構造方法
5. 子類例項成員和例項初始化塊 ,按在程式碼中出現的順序依次執行
6. 子類構造方法
結論:物件初始化的順序,先靜態方法,再構造方法,每個又是先基類後子類。
物件例項化分析
對記憶體分配情況分析最常見的示例便是物件例項化:
Object obj = new Object();
這段程式碼的執行會涉及 Java 棧、Java 堆、方法區三個最重要的記憶體區域。假設該語句出現在方法體中,及時對 JVM 虛擬機器不瞭解的 Java 使用這,應該也知道 obj 會作為引用型別(reference)的資料儲存在 Java 棧的本地變數表中,而會在 Java 堆中儲存該引用的例項化物件,但可能並不知道,Java 堆中還必須包含能查詢到此物件型別資料的地址資訊(如物件型別、父類、實現的介面、方法等),這些型別資料則儲存在方法區中。
另外,由於 reference 型別在 Java 虛擬機器規範裡面只規定了一個指向物件的引用,並沒有定義這個引用應該通過哪種方式去定位,以及訪問到 Java 堆中的物件的具體位置,因此不同虛擬機器實現的物件訪問方式會有所不同,主流的訪問方式有兩種:使用控制程式碼池和直接使用指標。
通過控制程式碼池訪問的方式如下:
通過直接指標訪問的方式如下:
這兩種物件的訪問方式各有優勢,使用控制程式碼訪問方式的最大好處就是 reference 中存放的是穩定的控制程式碼地址,在物件被移動(垃圾收集時移動物件是非常普遍的行為)時只會改變控制程式碼中的例項資料指標,而 reference 本身不需要修改。使用直接指標訪問方式的最大好處是速度快,它節省了一次指標定位的時間開銷。目前 Java 預設使用的 HotSpot 虛擬機器採用的便是是第二種方式進行物件訪問的。
相關文章
- Python例項屬性的優先順序分析Python
- java類初始化的順序Java
- Java子類和父類的初始化執行順序Java
- python中類的建立和例項化Python
- Java類初始化和例項化Java
- 類和例項
- ThinkPHP6 核心分析(二):Request 類的例項化PHP
- 【Java面試高頻】i++和++i的區別,單例模式的多種實現以及區別,類和例項初始化順序,不看血虧Java面試單例模式
- Dart - 抽象類的例項化Dart抽象
- ThinkPHP6 核心分析之Http 類跟Request類的例項化PHPHTTP
- python 類和例項Python
- Python中類建立和例項化過程Python
- JVM初探(五):類的例項化JVM
- 類的成員變數的初始化順序變數
- 附例項!圖解React的生命週期及執行順序圖解React
- Flutter Key的原理和使用(五) 需要key的例項:可拖動改變順序的ListviewFlutterView
- JVM類載入機制與類初始化順序JVM
- ThinkPHP6 例項化 Http 類和依賴注入PHPHTTP依賴注入
- 測試用例的優先順序
- Python學習:類和例項Python
- 淺談Java類中的變數初始化順序Java變數
- java中父類宣告子類例項化Java
- python類例項化如何實現Python
- 物件導向 -- 類的載入順序 類和物件的名稱空間物件
- 總結類初始化時的程式碼執行順序
- JavaScript執行順序分析JavaScript
- DS順序表--類實現
- Java父子類載入順序Java
- 關於類的初始化以及類的例項化一些思考
- php例項化物件的例項方法PHP物件
- Spring原始碼分析(二)bean的例項化和IOC依賴注入Spring原始碼Bean依賴注入
- Java中,類與類,類中的程式碼執行順序Java
- C#類中方法的執行順序C#
- for迴圈的例項分析
- [短文速度-4] new子類是否會例項化父類
- 自定義xunit測試用例的執行順序
- 例項 靜態 類
- Java中class的初始化順序Java