Java不像一些靜態編譯型的語言,是在編譯期間就進行鏈接的,而是在運行期間加載類的。這也爲Java提供了極大的靈活性。java
共7步: 加載-->(驗證-->準備-->解析)-->初始化-->使用-->卸載數組
其中(驗證-->準備-->解析) 又稱爲 鏈接.jvm
從加載到初始化 就是類的加載.spa
只有對類進行主動引用時纔會加載, 而被動引用則不會加載.線程
new對象, 訪問靜態變量, 調用靜態方法對象
反射繼承
主類生命週期
初始化子類時, 會先初始化父類io
對於>JDK1.7, 遇到MethodHandle 時,也會初始化編譯
常量: 常量在常連池中, 已經和類基本不要緊了
數組的定義
經過子類訪問父類的靜態字段
按照優先級關係以下:
1. Bootstrap 引導(啓動)類加載器 jvm的一部分 JAVA_HOME/lib
2. Extension 擴展類加載器 java JAVA_HOME/lib/ext
3. Application 系統類加載器 java classpath
4. 自定義類加載器 java
當加載一個類時, 會先委託給父類進行加載, 當父類加載不了時, 纔會由子類進行加載. 這就是雙親委派模型.
若是要自定義加載器, 繼承ClassLoader, 並重寫findClass 方法便可.
因爲雙親委派模型的限制, 越是基礎的類庫,就不能加載上層的類了. 例如 JNDI.
因而就引入了線程上下文類加載器.