一、類加載的過程.
1. 上圖
2. 具體分析
1.加載:使用ClassLoader把 .class 文件寫入到方法區內存
2.鏈接
- 2.1驗證:判斷編譯是否能通過
- 2.2準備:加載static,和final到方法區(這裏static會賦默認值,final賦指定值)
- 2.3.解析(將常量池中的符號引用替換爲直接引用)
(1)符號引用:就是 final float PI 中的 PI 就是符號
(2)直接引用:final float PI 的 PI的方法區的地址2341410x 就是直接引用
(3)解析階段,JVM會吧所有的類名,方法名,字段名,的符號引用替換爲內存地址的直接引用。
3.初始化:給默認的static賦值 和 執行static靜態代碼塊 - 父類沒有初始化就先初始化父類
二、對象產生的內存解析
-
會先把main所在的類
Demo類Class模板放到方法區,
然後棧中壓棧執行main方法 -
new Person()就會去方法區
尋找有無Person 的 Class
發現無,就加載Peron的Class模板到方法區 -
Perso模板加載到方法區後
就通過模板創建對象在堆區
然後棧區儲存變量的引用“zhangsan”
更多:
- 加載static main() 方法的時候就會吧“張三"儲存在Demo Class 的常量區(隸屬方法區)
- 然後zhangsan 在堆中的 對象的 name 值 “張三” 調用的 方法區 Demo class 模板 裏面的 “張三”