java類加載順序

在java中類的加載、初始化都是在程序運行期完成的,雖然會稍微增加開銷,但是卻很大的增加了靈活性,我們可用在運行期間動態的去網絡或其他地方加載一個二進制流來作為程序代碼的一部分。接下來我們簡單介紹下java類加載過程。
在這里插入圖片描述
從上圖中我們可以看到類的生命周期主要有7個過程,分別為加載、驗證、準備、解析、初始化、使用、卸載。

  1. 加載
    這個過程很簡單,就是通過ClassLoader去加載Class文件到內存中,當然Class文件的來源并沒有任何限制,既可以是我們的程序通過javac編譯器生成的,也可以來源于網絡等其他途徑。
  2. 驗證
    這個過程主要就是對Class文件中的字節流進行檢查,看看是否符合規范,是否存在安全問題等等。
  3. 準備
    這個過程主要是為類變量(static修飾的變量)分配內存并設置初始值,此時的初始值指的是通常情況下的零值,例如private static int a = 3,類變量a在這個階段會被賦值為0。唯一例外的類變量是使用final修飾的類變量,使用final修飾的類變量會在這個階段就賦給程序中設定的值。
  4. 解析
    這個階段主要將Class文件中對常量池的引用轉為直接內存引用,舉個簡單的例子:我們常會在代碼中使用import xxx.xxx.xxx.class,這里面的xxx.xxx.xxx.class就是符號引用,解析階段就是把這種符號引用轉換為對xxx.class具體內存地址的引用。
  5. 初始化
    這個階段主要負責初始化類對象(Class對象),會按照在文件中出現的順序為所有類變量賦值,同時執行靜態代碼塊。千萬注意這里初始化的是類對象而不是實例對象!
  6. 使用、卸載
    這兩個階段就沒啥可介紹的了,就是我們程序使用對象的過程,和對象生命周期結束后進行類型卸載的過程。

最后總結下對象靜態屬性/實例屬性初始化的順序:
(1)父類和子類的final static屬性初始化
(2)父類的static屬性初始化、父類的static代碼塊 (兩者按在文件中的聲明順序先后初始化)
(3)子類的static屬性初始化、子類的static代碼塊 (兩者按在文件中的聲明順序先后初始化)
(4)父類的非靜態屬性、父類的非靜態代碼塊 (兩者按在文件中的聲明順序先后初始化)
(5)父類的構造函數執行
(6)子類的非靜態屬性、 子類的非靜態代碼塊 (兩者按在文件中的聲明順序先后初始化)
(7)子類的構造函數執行

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450944.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450944.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450944.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

dealloc不調用的情況

2019獨角獸企業重金招聘Python工程師標準>>> 1、沒有停止定時器 - (void)dealloc { [_timer invalidate]; _timer nil; } 2、VC中有代理Delegate&#xff0c;需要設置delegate的時候&#xff0c;設置為weak property (nonatomic,weak) id<ZoeEatDe…

day10-列表生成式

列表生成式即List Comprehensions&#xff0c;是Python內置的非常簡單卻強大的可以用來創建list的生成式。 1、生成一個列表 a [i for i in range(1,100) if i%21]print(list(a))或print(a)[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, …

jrebel、JavaRebel

見&#xff1a;https://baike.baidu.com/item/jrebel/1115725?fraladdin JRebel是一套JavaEE開發工具。中文名jrebel屬 性JavaEE開發工具資 費收費軟件作 用Jrebel 可快速實現熱部署JRebel是一套JavaEE開發工具。JRebel允許開發團隊在有限的時間內完成更多的任務修正…

自己寫函數庫

大家現在寫 程序&#xff0c;是不是都是用新唐提供的函數庫&#xff1f;在體驗 開發板的一開始&#xff0c;我也是使用函數庫&#xff0c;畢竟這個太方便了。可是有一天&#xff0c;我發現一個只使用時鐘和IO以及 調試 串口的程序居然查過了16k的時候&#xff0c;我震驚了&…

[MicroPython]stm32f407控制DS18B20檢測溫度

2019獨角獸企業重金招聘Python工程師標準>>> 1.實驗目的 1. 學習在PC機系統中擴展簡單I/O 接口的方法。 2. 進一步學習編制數據輸出程序的設計方法。 3. 學習DS18B20的接線方法&#xff0c;并利用DS18B20檢測當前溫度。 2.所需元器件 F407Micropython開發板…

帶你理解Spring AOP

AOP概述 在我們的日常開發中&#xff0c;除了正常業務邏輯外&#xff0c;還可能經常會需要在業務邏輯的特定位置加入日志&#xff0c;以便于調試和問題分析。但是這種插入日志的邏輯和業務邏輯間并不存在連續性和依賴性&#xff0c;這種邏輯侵入隨著項目的不斷發展&#xff0c…

10.20隨筆

ES6 ECMAScript是一種由Ecma國際&#xff08;前身為歐洲計算機制造商協會,英文名稱是European Computer Manufacturers Association&#xff09;通過ECMA-262標準化的腳本程序設計語言。 這種語言在萬維網上應用廣泛&#xff0c;它往往被稱為JavaScript或JScript&#xff0c;但…

極客招募令!兄弟杯區塊鏈極客競技大賽在上海等您來戰!

據悉&#xff0c;由國內首家區塊鏈技術社區區塊鏈兄弟主辦&#xff0c;旺鏈科技、離子鏈、中國云體系產業創新戰略聯盟、無退社區、指旺金科等單位強力支持&#xff0c;HiBlock區塊鏈社區、火球財經、布洛克財經、海豚區塊鏈、區塊網等百家技術社區和媒體通力合作的兄弟杯區塊鏈…

Java中Web程序修改配置文件不重啟服務器的方法

見&#xff1a;http://blog.sina.com.cn/s/blog_69398ed9010191jg.html 另&#xff1a;http://ekisstherain.iteye.com/blog/1701463 jrebel 、JavaRebel是什么&#xff0c;見另一博客&#xff1a;jrebel/JavaRebel 開發環境 1. JDK 2. MyEclipse 3. Tomcat 4. Struts2 5.…

ffmpeg-0.6.3 移植到 windows 開源代碼

ffmpeg-0.6.3開源編碼解碼庫&#xff0c;從linux下移植到windows vs2005&#xff0c;全部開源。 需要 Intel C Compile 和 開源的SDL庫支持&#xff0c;由于 Intel C Compile支持C99語法&#xff0c;所以源代碼改動很小很小。 主要的修改 1&#xff1a;添加了linux中有而wind…

一起嘮嘮分布式鎖

&#xff08;1&#xff09;分布式鎖和分布式事務的區別 1.分布式鎖是在集群環境下&#xff0c;用來控制不同機器對全局共享資源的訪問。 2.分布式事務是在集群環境下&#xff0c;用來保證全局事務的一致性&#xff0c;保證多個數據庫的數據整體上能正確的從一個一致性狀態轉到…

luogu2577/bzoj1899 午餐 (貪心+dp)

首先&#xff0c;應該盡量讓吃飯慢的排在前面&#xff0c;先按這個排個序 然后再來決定每個人到底去哪邊 設f[i][j]是做到了第i個人&#xff0c;然后1號窗口目前的總排隊時間是j&#xff0c;目前的最大總時間 有這個i和j的話&#xff0c;再預處理出前i個人的排隊總時間sum[i]&a…

wpf中xps文檔合并功能實現

原文:wpf中xps文檔合并功能實現跟著上一篇的xps文檔套打的文章&#xff0c;近期一直在研究xps打印技術&#xff0c;其中用戶提到了一個需求&#xff0c;要求能夠多頁面進行打印&#xff0c;我的想法是&#xff0c;先生成xps文件&#xff0c;然后將文件讀取出來以后&#xff0c;…

DCT(離散余弦變換(DiscreteCosineTransform))

離散余弦變換&#xff08;Discrete Cosine Transform&#xff0c;簡稱DCT變換&#xff09;是一種與傅立葉變換緊密相關的數學運算。在傅立葉級數展開式中&#xff0c;如果被展開的函數是實偶函數&#xff0c;那么其傅立葉級數中只包含余弦項&#xff0c;再將其離散化可導出余弦…

從源碼看ConcurrentHashMap

簡介 ConcurrentHashMap是線程安全的HashMap實現&#xff0c;這里主要研究JDK8后的ConcurrentHashMap&#xff0c;下面是ConcurrentHashMap的簡單結構&#xff1a; ConcurrentHashMap基于HashMap的基本邏輯&#xff0c;通過CAS synchronized 來保證并發安全性。ConcurrentHas…

代碼重構的方法

見&#xff1a;http://blog.csdn.net/u011889786/article/details/51865344 見&#xff1a;http://blog.csdn.net/weiky626/article/details/1602691 一.提取子函數 說白了就是一個大函數里&#xff0c;可以根據不同功能分成幾個小函數&#xff0c;因為說不定&#xff0c;其他…

android 去掉標題欄、狀態欄、橫屏

// 去掉標題欄supportRequestWindowFeature(Window.FEATURE_NO_TITLE);// 全屏、隱藏狀態欄getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);// 橫屏setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION…

Spring Boot 整合Mybatis (一)

2019獨角獸企業重金招聘Python工程師標準>>> 新建spring-boot項目&#xff0c;相關依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><de…

x264 的 cache詳解

在這里和下一級別的分析中有必要先講一下這個h->mb.cache&#xff08;沒法講&#xff0c;就是cache!&#xff09;。 x264_macroblock_cache_load將參考幀中某位置的&#xff08;重建后&#xff09;數據保存進cache&#xff0c;供參考和反復使用。 x264_macroblock_cache_s…

同步/異步阻塞/非阻塞

平時開發中經常會聽大家說到什么同步阻塞、異步非阻塞等等名詞&#xff0c;這里我談下自己對這兩個名詞的理解&#xff0c;僅僅是個人觀點&#xff0c;并不一定正確。 1.阻塞/非阻塞 我認為判定阻塞還是非阻塞&#xff0c;取決于線程所做的操作是否需要將線程掛起等待。 舉個…