1.類(lèi)的加載過(guò)程
- 加載 :查找并加載類(lèi)的二進(jìn)制數(shù)據(jù)
- 連接:
1.驗(yàn)證:確保被加載的類(lèi)的正確性
2.準(zhǔn)備:為類(lèi)的靜態(tài)變量分配內(nèi)存,并將其初始化為默認(rèn)值
3.解析:把類(lèi)的符號(hào)引用轉(zhuǎn)為直接引用 - 初始化
為類(lèi)的靜態(tài)變量賦予正確的初始值
java程序?qū)︻?lèi)的使用方式可分為兩種
- 主動(dòng)使用
- 被動(dòng)使用
所有的java虛擬機(jī)實(shí)現(xiàn)必須在每個(gè)類(lèi)或接口被java程序“首次主動(dòng)使用”時(shí)才會(huì)被初始化他們
2.主動(dòng)使用的場(chǎng)景
1.創(chuàng)建類(lèi)的實(shí)例
2.訪(fǎng)問(wèn)某個(gè)類(lèi)或接口的靜態(tài)變量,或者對(duì)該靜態(tài)變量賦值
3.調(diào)用類(lèi)的靜態(tài)方法
4.反射
5.初始化一個(gè)類(lèi)的子類(lèi)
6.Java虛擬機(jī)啟動(dòng)時(shí)被標(biāo)明為啟動(dòng)類(lèi)的類(lèi)
7.JDK1.7開(kāi)始提供的動(dòng)態(tài)語(yǔ)言支持
除了以上七種情況,其他使用java類(lèi)的方式都會(huì)被看作是對(duì)類(lèi)的被動(dòng)調(diào)用尾序,都不會(huì)導(dǎo)致類(lèi)的初始化
3.加載.class文件的方式
- 從本地系統(tǒng)中直接加載
- 從網(wǎng)絡(luò)下載.class文件
- 從zip jar 等歸檔文件中加載
- 從轉(zhuǎn)悠數(shù)據(jù)庫(kù)中提取.class
- 將java源文件動(dòng)態(tài)編譯為.class文件
練習(xí)題:
public class MyText{
public static void main(String[] args){
System.out.printIn(MyChild.str)
}
}
class MyParent{
public static String str = "hello world";
static{
System.out.printIn("MyParent static block")
}
}
class MyChild{
public static String str1 = "welcome";
static{
System.out.printIn("MyChildstatic block")
}
}